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
这样的广告连播
我有 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
这样的广告连播