首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使此函数异步处理应用程序警告?

如何使此函数异步处理应用程序警告?
EN

Stack Overflow用户
提问于 2022-11-18 23:54:40
回答 1查看 44关注 0票数 1

我正在使用SwiftUI 4.0并拥有SwiftSoup包。当我试图加载一个网站,我现在得到这条消息(发生在任何网站)

https://www.cnn.com的同步URL加载不应该发生在应用程序的主线程上,因为它可能导致UI无响应。请切换到异步网络API,如URLSession。

它特别发生在代码的这一节中。

代码语言:javascript
复制
if let html = try? String(contentsOf: myURL, encoding: .utf8) {

有没有人对如何解决这个问题有建议。这是我正在使用的函数

代码语言:javascript
复制
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", "")
    }
    
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-19 00:29:17

问题

发生此错误是因为String(contentsOf: )是同步的,并且可能导致UI挂起。相反,可以使用如下所示的URLSession。下面的函数,给定一个asynchronously,将为您提供String

解决方案

代码语言:javascript
复制
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 ""
   }
}

代码细分:

  1. let session是您的应用程序文档的共享URL Session,在这里:URLSession.Shared
  2. let (theStringAsData, _)在这里返回此方法的Data对象和URLResponse -文档:https://developer.apple.com/documentation/foundation/urlsession/3767352-data
  3. 我们检查以确保该数据不是零,如果String的类型广播有效,则返回新的String。否则,我们会返回一个空的。

示例用法:

代码语言:javascript
复制
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")
}
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74496439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档