快速的高阶函数(例如map,reduce,filter,sort)是同步还是异步? 高阶函数是否是线程安全的?如果不是,那么我们如何使它们线程安全?通过在串行队列中实现它们?
答案 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
类家族,它们通常通过非主线程上的异步回调传递网络操作的结果。您可以利用您在不同线程上的事实,或者可以像上面的示例一样“返回”主线程。
总而言之,这取决于高阶函数的设计者,因此一个简短的答案是:如果它是一个转义参数,请查阅文档。