快速的高阶函数是同步还是异步?他们是否线程安全?

时间:2019-11-15 18:20:28

标签: swift

快速的高阶函数(例如map,reduce,filter,sort)是同步还是异步? 高阶函数是否是线程安全的?如果不是,那么我们如何使它们线程安全?通过在串行队列中实现它们?

2 个答案:

答案 0 :(得分:3)

  

是否有快速的高阶函数,例如map,reduce,filter,sort?

同步

  

线程安全

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

答案 1 :(得分:1)

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

绝对会以同步方式在同一线程上调用

不可转义块。例如,所有列表操作高阶函数(映射,过滤器等)均不可转义。实际上,编译器可以内联和优化其中一些功能,以使它们根本没有任何功能调用。

转义块有所不同。如果您自己设计一个高阶函数,并且碰巧将块存储在一个变量中以供以后调用,则编译器将强制您将其声明为@escaping。这些块被允许在以后从任何线程调用。

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

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

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

总而言之,这取决于高阶函数的设计者,因此一个简短的答案是:如果它是一个转义参数,请查阅文档。

相关问题