使用Async库,在后台线程上工作的简单模式可能如下所示:
// Assume we start on the main thread
let onResultComplete: (result: ResultType) -> Void = { result in
Async.main {
// Code to handle one result at a time on the main thread
}
}
Async.background {
doCalculationsThatProduceManyResults(onEachResultComplete: onResultComplete)
}
现在考虑这种情况,代码已经在后台线程上执行:
// Assume we start on some "unknown background thread"
let onResultComplete: (result: ResultType) -> Void = { result in
Async.??? {
// Code to handle one result at a time on the "unknown background thread"
}
}
Async.background {
doCalculationsThatProduceManyResults(onEachResultComplete: onResultComplete)
}
如何强制关闭onResultComplete
在我称为Async.background
的相同未知背景线程上运行?
我对任何使用GCD方法的建议持开放态度。
答案 0 :(得分:1)
在iOS或macOS上,如果某些代码在未知线程或调度队列上执行(例如:"执行上下文"),则无法获得可靠的获取一些"处理"为此 - 好吧,除非这是主线。
因此,您的问题的解决方案是首先创建或获取已知的执行上下文(也称为调度队列或线程)并在此处执行您的代码。然后,在continuation(又名完成处理程序)中,再次显式地调度回同一个执行上下文并继续使用您的代码。
答案 1 :(得分:0)
请勿致电Async.anything
。只需在线运行代码(假设Async库在运行计算的同一线程上调用它的完成块。
您的问题特定于Async库,因此您应该将其放在标题中并为其添加标记。 (我从未使用它,所以我不知道它是如何工作的具体细节。)