swift的高阶函数是同步的还是异步的?它们是否线程安全



map、reduce、filter、sort等swift高阶函数是同步的还是异步的?高阶函数是否线程安全?如果没有,我们如何才能使它们线程安全?通过在串行队列中实现它们?

是否是map、reduce、filter、sort等swift高阶函数?

同步

线程安全

不,您的工作是以非混合的方式使用,否则将操作嵌入串行队列(主队列是串行的(

当您将一个函数或块传递给另一个函数时,请注意参数的类型:它可以是@escaping@nonescaping(后者是默认值,通常在定义中省略(。

非转义块肯定会在同一个线程上以同步方式调用。例如,所有列表操作的高阶函数(映射、过滤器等(都是非转义的。事实上,编译器可以内联和优化其中的一些函数,使其根本不需要任何函数调用。

逃离区块有点不同。如果您自己设计了一个更高阶的函数,并且碰巧将块存储在稍后调用的变量中,编译器将强制您将其声明为@escaping。这些块可以在很久以后从任何线程调用。

当处理系统或API调用时,您需要检查文档。例如,关于AVCaptureDevice.requestAccess(for:completionHandler:)的文档指出,回调可以在任意线程上调用,因此您有责任确保UI代码在主线程上执行。你通常这样做:

AVCaptureDevice.requestAccess(for: .video, completionHandler: { (granted) in
DispatchQueue.main.async {
// Execute UI code here
}
})

另一个例子是URLSessionTask类家族,它们通常通过非主线程上的异步回调来传递网络操作的结果。您可以利用您在不同线程上的事实,也可以像上面的例子一样"返回"到主线程。

总而言之,这取决于高阶函数的设计者,所以简单的答案是:如果它是一个转义参数,那么请检查文档。

最新更新