Swift 带有 do try 块的函数弄乱了 UIView

Swift function with do try block messes up UIView

我有 2 个函数,当我调用它们时会弄乱我的 UIView。我在点击 Button 时打电话给他们。在我调用这两个函数之前,我在 UIView 上调用了 View.isHidden = false。问题是,如果我在下面调用这两个函数,.isHidden 会在几秒钟后被调用,看起来很笨拙。

@objc func addWishButtonTapped() {

    setUpLoadingAnimation() // this is where I call MyCustoView.isHidden = false

    self.crawlWebsite { // here I call the two functions below 
       ...
    }


}

crawlWebsite:

func crawlWebsite(finished: @escaping () -> Void){
    
    var html: String?
    guard let url = self.url else {
        return
    }
    let directoryURL = url as NSURL
    let urlString: String = directoryURL.absoluteString!
    // save url to wish
    self.wishView.link = urlString

    
    html = self.getHTMLfromURL(url: url)
    self.getContentFromHTML(html: html, url: url)

}

函数 1:

    //MARK: getHTMLfromURL
func getHTMLfromURL(url: URL?) -> String{
    
    let myURLString = url
    guard let myURL = myURLString else {
        print("Error: \(String(describing: url)) doesn't seem to be a valid URL")
        return ""
    }

    do {
        let myHTMLString = try String(contentsOf: myURL, encoding: .utf8)
        return myHTMLString
    } catch let error {
        print("Error: \(error)")
    }
    
    return ""
}

函数 2:

    //MARK: getContent
func getContentFromHTML(html: String?, url: URL){
    
    do {
        let doc: Document = try SwiftSoup.parse(html ?? "")
        
        if url.absoluteString.contains("amazon") {
            self.getAmazonImage(url: url)
        }
        
        self.getImages(doc: doc)
        
        // set price if not 0
        let price = Int(self.getPrice(doc: doc))
        if price != 0 {
            self.wishView.amount = Int(self.getPrice(doc: doc))
            self.wishView.priceTextField.text = self.wishView.updateAmount()
        }
        
    } catch Exception.Error( _, let message) {
        print(message)
    } catch {
        print("error")
    }
    
}

我该怎么做才能让我的视图动画运行流畅?我尝试将这两个函数嵌入到 DispatchQueue.main.async 中,但我无法使其正常工作……有什么想法吗?我在这里错过了什么?

如果你想确保 setUpLoadingAnimation()self.crawlWebsite 之前被调用,那么最 logical/straightforward 的解决方案是在 setUpLoadingAnimation() 中使用一个完成处理程序,像这样

func setUpLoadingAnimation(completion: @escaping ()-> ()){
    //hideView
    completion()
}

setUpLoadingAnimation{

   self.crawlWebsite { 
      ...
   }

}

let myHTMLString = try String(contentsOf: myURL, encoding: .utf8) - 这行是你的问题。

您没有正确调用外部 URL。 此 String(contentsOf: myURL, encoding: .utf8) 应仅与设备上的本地文件 URL 一起使用,而不应与外部文件 link 一起使用。当您尝试使用外部 URL 执行此操作时,它会阻塞您的主队列,因此您很可能会遇到故障。

为此使用 URLSession。阅读文档 here

您也可以使用 Alamofire

这样的广告连播