Проблема с производительностью UIView, если функция вызывается после отображения представления

#ios #swift #animation #uiview #uibutton

#iOS #swift #Анимация #uiview #uibutton

Вопрос:

У меня есть a UIView , который появляется при нажатии a UIButton . Дело в том, что это для веб-сайта, поэтому перед отображением фактического представления у меня есть a с a, который отображается до тех пор, пока данные не будут удалены с веб-сайта view scraping coverView loadingAnimation :

 @objc func addWishButtonTapped() {
    self.coverView.isHidden = false
    self.loadingAnimation.play()
    self.wishView.isHidden = false
    self.cancelButton.isHidden = false
    self.wishView.dropDownButton.dropView.dropOptions = dropOptions
    crawlWebsite {
        DispatchQueue.main.async {
            self.hideLoadingView()
        }
    }
}
 

Моя проблема в том, что при вызове crawlWebsite , подобном описанному выше, анимация неуклюжая и не выглядит гладкой:

неуклюжая анимация

Я обнаружил, что когда я не вызываю crawlWebsite его, он выглядит идеально гладким:

плавная анимация

Это crawlWebsite :

 func crawlWebsite(finished: @escaping () -> Void){
    
    var html: String?
    let url = webView.url
    html = (self.getHTMLfromURL(url: url))
    print(url as Any)
    let directoryURL = url! as NSURL
    let urlString: String = directoryURL.absoluteString!
    // save url to wish
    self.wishView.link = urlString
    OpenGraphDataDownloader.shared.fetchOGData(urlString: urlString) { result in
        switch result {
        case let .success(data, _):
            // get productTitle
            guard let title = data.pageTitle else {finished(); return}
            print(title)
            DispatchQueue.main.async {
                self.wishView.wishNameTextField.text = title
                self.wishView.enableButton()
            }
            // get productImage
            guard let imageURL = data.imageUrl else {finished(); return }
            UIImage.loadFrom(url: imageURL, completion: { (image) in
                
                guard let image = image else { return }
                self.wishView.wishImageView.image = image
                self.imagesArray.append(image)
                self.wishView.hideAddImageButton()
                self.wishView.showImageView()
                finished()
            })
            finished()
            
        case let .failure(error, _):
            finished()
            print("OpenGraph-error: "   error.localizedDescription)
        }
    }
    DispatchQueue.main.async {
        self.getContentFromHTML(html: html)
    }
}
 

Я совсем застрял здесь и не знаю, что здесь происходит. У кого-нибудь есть идея?

Комментарии:

1. Попробуйте вызвать crawlWebsite фоновый поток.

2. Что делает self.getContentFromHTML(html: html)? Также я бы, вероятно, переместил каждое обновление представления внутрь обработчика завершения и получил доступ только к основному потоку там.

3. @krlbsk как мне это сделать?

4. @Chris Попробуйте DispatchQueue.global().async { self.crawlWebsite { ... } } .

5. @MarcoBoerner он ищет в HTML цену и изображения