所以,在不久前了解了完成块之后,我非常喜欢使用完成块。我喜欢封闭,我喜欢能够在任何我想要的地方传递任何东西。
作为线程编程的新手,我一直远离 GCD 和 NSOperation——但最近我不得不对 Core Data 的东西进行异步更新,我开始怀疑我的“所有完成块” “ 方法。
所以这是我在质疑自己的一个例子:我有一系列可能相当大的数据(图像、声音、视频,你有什么)要上传到某个地方的服务器。这些数据的元数据存储在 Core Data 中,我有一个时间戳用于决定应该上传哪些对象。所有这些上传都应该按顺序完成。
我编写的代码基本上只是一个带有完成块的函数,它在块的末尾有一个对自身的调用,如下所示:
(void)uploadAllAsynchronously {
... // First figure out what to upload based on core data
// Here comes the completion block in question
void(^blk)(BOOL) = ^(BOOL)uploadSuccess {
... // if upload successful, update core data to mark what has been uploaded
[self uploadAllAsynchronously]; // Recursively calls the function that contains this block. I actually have a weak self, or if that fails to break a retain cycle, I should be able to pass in a NSManagedObjectContext as an argument.
}
[NSURLConnection sendAsynchronousRequest:... queue:... completionHandler:blk];
}
这应该有效,对吧?这里是否有一些完全危险的东西表明我必须使用 GCD 并处理我自己的队列?我问这个是因为我现在有点麻烦,可能其中的数据会出现不同的线程由于异步调用而无法正确更新,尽管不确定我的代码的哪一部分是罪魁祸首。
提前致谢。