我有一个HTML页面链接数组,我想一个接一个地加载这样的链接.

我正在使用HTMLKit.

显然,下载HTML页面是一个XSLT操作.

我用的是

func getPage(_ url:Url) {
    webView.evaluateJavaScript("document.body.innerHTML") {result, error in {
      // get page
    } 
}

这是一个反腐败行动.

这是从类似于

for link in links {
    getPage(link)
}

因为这个循环运行得非常快,所以logc操作没有时间运行,只下载了最后一个链接.

如何才能使循环等待一个页面完成,然后再进入下一个页面?

推荐答案

你可以在Continuation(https://developer.apple.com/documentation/swift/checkedcontinuation)的帮助下使你的getPage功能async

    func getPage(_ url: URL) -> async throws ReturnType {
        return try await withCheckedThrowingContinuation { continuation in
            webView.evaluateJavaScript("document.body.innerHTML") { result, error in
                if let error {
                    continuation.resume(throwing: error)
                }
                
                if result == .success(let data) {
                    continuation.resume(returning: data)
                }
            }
        }
    }

用途:

for link in links {
   do {
      try await getPage(link)
   } catch {
     // Handle error
   }
}

注意:由于您的代码不可构建,因此这里的代码解决方案是概念性的.您可以在Continuationhttps://github.com/MahiAlJawad/ModernSwiftConcurrency-iOS中的此链接中使用一些代码示例

Swift相关问答推荐

MyApp类型不符合协议App''''

从任务中打印

当将新值推送到 NavigationStack 时,SwiftUI 的 navigationDestination 已在堆栈的早期声明

RxSwift 中 Single.just(...) 和 Observable.just(...) 之间有区别吗?

SwiftUI - Select 器没有 Select 值

如何使 SwiftUI Picker 换行文本

将数据附加到 Firebase 实时数据库后,NavigationLink 将我重定向到上一个视图

在 Swift 中实现自定义异步序列

如何有条件地格式化 SwiftUI 代码

如何使被拖动的对象成为前景(foreground)对象

在 Swift 中从 HTML 生成带有图像的 PDF 而不显示打印界面

我将哪种 Swift 数据类型用于货币

iOS Swift - 如何更改表格视图的背景 colored颜色 ?

MKAnnotation Swift

Swift - 迭代 struct 对象时如何对其进行变异

在 Swift 中以编程方式更新约束的常量属性?

如何在 SwiftUI 中为删除和禁用配置 ContextMenu 按钮?

ld:入口点(_main)未定义.对于架构 x86_64:Xcode 9

Swift 中的 recursiveDescription 方法?

转换为 swift 3 后,视图控制器中出现奇怪的通用函数