正确地将Swift闭包传递到另一个线程中
如何正确地(从多线程的角度)将闭包传递给另一个线程 考虑一种情况:正确地将Swift闭包传递到另一个线程中,swift,multithreading,Swift,Multithreading,如何正确地(从多线程的角度)将闭包传递给另一个线程 考虑一种情况: class NetManager { ... var processingClosure : (Data, DispatchQueue, @escaping (Data?) -> ()) -> () = { respData, complQueue, complClosure in let resultData = // process respData accordi
class NetManager {
...
var processingClosure : (Data, DispatchQueue, @escaping (Data?) -> ()) -> () = {
respData, complQueue, complClosure in
let resultData = // process respData according to some logic and get resultData
complQueue.async {
complClosure(resultData)
}
// PLEASE NOTE that there is no captured variables in this closure
}
...
func requestData1(..., complClosure) {
// this is main thread context
// make request to endpoint 1 somehow and process result in separate processing queue
...
let procClosure = self.processingClosure
// processingQueue is NOT main queue and not completion queue
request.processingQueue.async {
// Question HERE:
procClosure(data, DispatchQueue.main, complClosure)
// is such passing of the closure safe? Can I have issues with concurrency?
}
}
func requestData2(..., complClosure) {
// the same as requestData1 but gets data from endpoint 2
...
let procClosure = self.processingClosure
request.processingQueue.async {
procClosure(data, DispatchQueue.main, complClosure)
}
}
}
这似乎是传递闭包的安全方法,因为它不捕获任何变量。procClosure调用是否存在并发问题
是否有更好的方法封装数据转换的通用功能,以便在对不同端点的类似请求中重用(我可以只封装数据处理而不封装请求)?是否只希望其中一个运行?这显然是一个比赛条件,如果他们两个都在一个完成之前被呼叫。但是,如果先调用哪个变量或不调用哪个变量很重要,那么在调用proclosure时,您可以始终存储一个变量,并始终查看该变量是否已设置。根据调用procClosure时的情况而定。@TPN1994否,requestData1和requestData2可以同时运行。虽然正如我所写的,闭包本身并没有捕获任何东西,所以我认为它应该是可重入的。以前,在obj-c中,我只是复制闭包(块),但在Swift中似乎不可能。啊,我的mistkae,我现在更了解这个问题了。不过很奇怪,为什么需要像这样将闭包从一个线程传递到另一个线程?为什么需要在特定的线程上运行ProcClose?@TPN1994好吧,我有不同的端点,具有不同的请求形式,但数据处理是相同的。它相对较重,因此最好在主线程下进行处理。因为没有理由多次编写代码,所以需要将其封装到某个地方。一种可能是闭包,另一种可能是全局函数。