我正在使用SwiftUI 4.0并拥有SwiftSoup包。当我试图加载一个网站,我现在得到这条消息(发生在任何网站)
https://www.cnn.com的同步URL加载不应该发生在应用程序的主线程上,因为它可能导致UI无响应。请切换到异步网络API,如URLSession。
它特别发生在代码的这一节中。
if let html = try? String(contentsOf: myURL, encoding: .utf8) {有没有人对如何解决这个问题有建议。这是我正在使用的函数
import Foundation
import SwiftUI
import Combine
import SwiftSoup
func NewLinkRequest(_ LinkUrl: String) ->(LinkUrl: String ,LinkTitle: String ,LinkImage: String)
{
var newTitle = ""
let urlm = URL(string: LinkUrl)
guard let myURL = urlm else {
return ("","Failed to get url", "")
}
if let html = try? String(contentsOf: myURL, encoding: .utf8) {
do {
let doc: Document = try SwiftSoup.parseBodyFragment(html)
let headerTitle = try doc.title()
let firstImage = try doc.select("img").attr("src")
newTitle = headerTitle
return (LinkUrl,newTitle, firstImage)
} catch Exception.Error( _, let message) {
print("Message: \(message)")
} catch {
print("error")
}
return ("","", "")
} else {
return ("","Failed to get url", "")
}
}发布于 2022-11-19 00:29:17
问题
发生此错误是因为String(contentsOf: )是同步的,并且可能导致UI挂起。相反,可以使用如下所示的URLSession。下面的函数,给定一个asynchronously,将为您提供String。
解决方案
func fetchFromURL(_ url: URL) async -> String{
let session = URLSession.shared
let (theStringAsData, _) = try await session.data(from: articleUrl)
if let returnableString = String(data: theStringAsData, encoding: .utf8)
{
return returnableAsString
} else {
return ""
}
}代码细分:
let session是您的应用程序文档的共享URL Session,在这里:URLSession.Sharedlet (theStringAsData, _)在这里返回此方法的Data对象和URLResponse -文档:https://developer.apple.com/documentation/foundation/urlsession/3767352-data。String的类型广播有效,则返回新的String。否则,我们会返回一个空的。示例用法:
import SwiftSoup
Task{
let theString = fetchFromURL(URLHERE) //Put your URL here!
do{
let document = try SwiftSoup.parse(theString) //This is now the parsed document if it worked
print(document)
} catch {
print("Failed to parse")
}
}https://stackoverflow.com/questions/74496439
复制相似问题