正确地将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好吧,我有不同的端点,具有不同的请求形式,但数据处理是相同的。它相对较重,因此最好在主线程下进行处理。因为没有理由多次编写代码,所以需要将其封装到某个地方。一种可能是闭包,另一种可能是全局函数。