Swift + Async:如何在创建它的同一个线程上执行回调?

时间:2016-06-16 00:31:47

标签: ios swift multithreading asynchronous

使用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方法的建议持开放态度。

2 个答案:

答案 0 :(得分:1)

在iOS或macOS上,如果某些代码在未知线程或调度队列上执行(例如:"执行上下文"),则无法获得可靠的获取一些"处理"为此 - 好吧,除非这是主线。

因此,您的问题的解决方案是首先创建或获取已知的执行上下文(也称为调度队列或线程)并在此处执行您的代码。然后,在continuation(又名完成处理程序)中,再次显式地调度回同一个执行上下文并继续使用您的代码。

答案 1 :(得分:0)

请勿致电Async.anything。只需在线运行代码(假设Async库在运行计算的同一线程上调用它的完成块。

您的问题特定于Async库,因此您应该将其放在标题中并为其添加标记。 (我从未使用它,所以我不知道它是如何工作的具体细节。)