swift 取消带有全局标志的iOS/UIKit异步任务

pn9klfpd  于 2023-03-22  发布在  Swift
关注(0)|答案(2)|浏览(141)

环境:Swift 5,Xcode 14,iOS 15,UIKit(NOT SwiftUI)
我有一个长时间运行的异步任务,我在Task块中执行:

Task { () -> () in
  do {
    for z in arrayData{
      if killTask {        // an external property
        try Task.cancel()  // **Swift Errors here**
      }
      let x1 = try await self.longTask1(z.var1)
      let x2 = try await self.longTask2(z.var2)
      etc.
    }
  } catch { print("Bad") }
}   //  end task

这会因为Swift语法错误而失败,即无法推断任务中的成功和失败。任务不产生Result类型。有人能告诉我正确的方向吗?我可以通过外部信号量条件取消任务(没有输入/输出/结果类型)?

j5fpnvbx

j5fpnvbx1#

不需要引入killTask属性,您可以保存Task,稍后可以保存cancel
你会有一个属性:

var task: Task<Void, Error>?

以及

task = Task {
    for z in arrayData {
        try Task.checkCancellation()
        let x1 = try await self.longTask1(z.var1)
        let x2 = try await self.longTask2(z.var2)
        ...
    }
}

后来呢

task?.cancel()
4ngedf3f

4ngedf3f2#

如果您正在生成多个非结构化任务,为了管理它们并处理它们的取消,您可以使用TaskGroupwithTaskCancellationHandler创建自己的取消处理构造,类似于Kotlin中的CoroutineScope和C#中的CancellationToken。

相关问题