Массовое чрезмерное использование ЦП всякий раз, когда я sh ViewController - Swift - программно - PullRequest
1 голос
/ 07 августа 2020

У меня высокий уровень ЦП всякий раз, когда я sh новый ViewController из navigationController.

Я использовал инструмент Time Profiler, и оказалось, что проблема, вызывающая чрезмерное использование ЦП, связана с ViewController, который я встроил в rootViewController.

ViewController, о котором я говорю, выглядит следующим образом:

class QuoteGeneratorController : UIViewController {

let interactiveShowTextView : UITextView = {
   let textView = UITextView()
    textView.font = UIFont(name: "avenir-black", size: 35)
    textView.textColor = .white
    textView.textAlignment = .left
    textView.textContainer.maximumNumberOfLines = 3
    textView.backgroundColor = .clear
    textView.isEditable = false
    textView.isSelectable = false
    textView.isUserInteractionEnabled = false
    return textView
}()

let progressBar : UIProgressView = {
    let progressView = UIProgressView(progressViewStyle: .bar)

    progressView.trackTintColor = UIColor.clear
    progressView.tintColor = UIColor.white

    return progressView
}()


let quotesArray = ["Hello", "Hello2", "Hello3"]


override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    print("I'm called")
    view.subviews.forEach { subview in
        subview.layer.masksToBounds = true
        subview.layer.cornerRadius = progressBar.frame.height / 2.0
    }
    
}

override func viewDidAppear(_ animated: Bool) {
    
    
    setUpAnimation()
}


override func viewDidLoad() {
    setUpUI()
    
    setUpAnimation()
}


fileprivate func setUpUI(){
    view.addSubview(interactiveShowTextView)
    view.addSubview(progressBar)
   
    interactiveShowTextView.anchor(top: view.safeAreaLayoutGuide.topAnchor, leading: view.leadingAnchor, bottom: nil, trailing: view.trailingAnchor)
    interactiveShowTextView.heightAnchor.constraint(equalToConstant: 150).isActive = true
    
    progressBar.anchor(top: interactiveShowTextView.bottomAnchor, leading: interactiveShowTextView.leadingAnchor, bottom: nil, trailing: nil, padding: .init(top: 10, left: 0, bottom: 0, right: 0), size: .init(width: 70, height: 9))
    
    
}

var iterator : Int = 0


fileprivate func setUpAnimation(){
    
    switch iterator {
    case 0:
        animateAndIterate()

    case 1:
        animateAndIterate()

    case 2:
        animateAndIterate()

    default:

        self.iterator = 0
        self.setUpAnimation()

}

}

fileprivate func animateAndIterate(){
    UIView.animate(withDuration: 0.0, animations: {
        self.progressBar.layoutIfNeeded()
    }, completion: { finished in
        self.progressBar.progress = 1.0
        self.interactiveShowTextView.text = self.quotesArray[self.iterator]
        self.interactiveShowTextView.fadeIn()
        UIView.animate(withDuration: 3, delay: 0.0, options: [.curveLinear], animations: {
            self.progressBar.layoutIfNeeded()
            self.perform(#selector(self.afterAnimation), with: nil, afterDelay: 2.5)
        }, completion: { finished in
            self.interactiveShowTextView.fadeOut()
            self.progressBar.progress = 0
            self.iterator = self.iterator + 1
            self.setUpAnimation()
        })
    })
    
}

@objc func afterAnimation() {
    self.interactiveShowTextView.fadeOut()
}
}

На самом деле я не знаю, что могло вызвать проблему, и поскольку я ' m новичок в профилировщике времени Я думаю, что некоторые из вас сталкивались с тем же процессом в процессе разработки.

В профилировщике времени я получаю следующие указания:

1 Ответ

0 голосов
/ 07 августа 2020

При использовании блоков завершения рекомендуется использовать слабые ссылки на результат. В противном случае AR C будет считать каждую ссылку, которую вы использовали внутри этого блока.

Используйте такие замыкания:

view.subviews.forEach { [weak self] subview in
    subview.layer.masksToBounds = true
    subview.layer.cornerRadius = progressBar.frame.height / 2.0
}

// (...)

fileprivate func animateAndIterate() {
    UIView.animate(withDuration: 0.0, 
                     animations: { [weak self] in
        self?.progressBar.layoutIfNeeded()
    }, completion: { [weak self] finished in
        self?.progressBar.progress = 1.0
        self?.interactiveShowTextView.text = self.quotesArray[self.iterator]
        self?.interactiveShowTextView.fadeIn()
        UIView.animate(withDuration: 3, 
                              delay: 0.0, 
                            options: [.curveLinear], 
                         animations: { [weak self] in
            self?.progressBar.layoutIfNeeded()
            self?.perform(#selector(self.afterAnimation), 
                          with: nil, afterDelay: 2.5)
        }, completion: { finished in
            self?.interactiveShowTextView.fadeOut()
            self?.progressBar.progress = 0
            self?.iterator = self.iterator + 1
            self?.setUpAnimation()
        })
    })
}
...