【问题标题】:Swift function with do try block messes up UIView带有 do try 块的 Swift 函数弄乱了 UIView
【发布时间】:2021-04-28 17:53:31
【问题描述】:

我有 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)

}

功能一:

    //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 中,但我无法让它工作......知道吗?我在这里错过了什么?

【问题讨论】:

  • 请上传crawlwebsite、hideloadingview、setuploading动画的代码
  • @LucaSfragara 我更新了我的问题,有帮助吗?
  • 请上传一些工作代码。 crawlWebsite 中的三个点是什么?为什么不调用 finished 闭包?请上传setUpLoadingAnimation的代码。我希望你能理解,如果我看不到完整的代码,我帮不了你
  • 我在crawlWebsite-closure 中调用了其他一些东西,但这不是错误的原因。我在crawlWebsite 内部的另一个函数中调用finished 我将其缩小到上面的两个函数。如果我删除上面的两个功能,一切都可以正常工作。所以错误一定在上面的代码中。你需要什么? :)
  • 一个最小的可重现示例。不管怎样,看我的回答

标签: ios swift uiview dispatch-async


【解决方案1】:

如果您想确保在self.crawlWebsite 之前调用setUpLoadingAnimation(),那么最合乎逻辑/最直接的解决方案是像这样在setUpLoadingAnimation() 中使用完成处理程序

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

setUpLoadingAnimation{

   self.crawlWebsite { 
      ...
   }

}

【讨论】:

  • 那不是修复它......同样的行为
  • 我很确定这与asynchronous calls有关
  • let myHTMLString = try String(contentsOf: myURL, encoding: .utf8) 这导致 函数 1 出现问题
【解决方案2】:

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

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

为此使用URLSession。阅读文档here

你也可以使用像Alamofire这样的pod

【讨论】:

  • 哦,好吧,没想到会是这种问题:/你能给我举个例子吗?不太清楚如何做到这一点
  • 我不能让它和dispatch.main.asnyc一起工作吗?
  • init(contentsOf: URL, encoding: String.Encoding) 旨在与本地 URL(路径 url)一起使用,而不是与外部 URL 一起使用。试试这个答案:link
  • 就是这样。它现在正在工作,谢谢伙计
猜你喜欢
  • 2022-10-07
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
相关资源
最近更新 更多