因此,在了解完成块之后,我很喜欢使用完成块。我喜欢关闭,我喜欢在任何地方传递任何想要的东西的能力。关于使用完成块排队
作为线程编程的新手,我一直在远离GCD和NSOperation - 但最近我不得不编程异步更新到核心数据的东西,我开始怀疑我的“全部完成阻止所有的时间“的方法。
所以这里是我自问的一个例子:我有一系列可能相当大的数据(图像,声音,视频,你有什么)上传到服务器的地方。这些数据的元数据存储在核心数据中,并且我有一个时间戳用于决定应该上传哪些对象。所有这些上传应该按顺序进行。
我所编码的是一种本质上基本上是一个在它完成块,在该块的一端有一个电话给自己,这样的功能:
(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并处理我自己的队列?我问这是因为我现在有点麻烦,可能数据中会出现不同的线程,由于异步调用而不能正确更新,但不知道我的代码的哪一部分是罪魁祸首。
在此先感谢。
请记住,完成处理程序通常不会在后台线程上运行。通常(包括'[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]')完成块在主线程上执行。所以你根本不用担心线程安全。如果主线程在后台线程完成下载时处于繁忙状态,则在执行完成块之前,主线程将处于空闲状态。 –
我发现有一种情况嵌套完成块会有问题,并可能导致死锁:http://www.cocoawithlove.com/2010/06/avoiding-deadlocks-and-latency-in.html – Victor