我有一个关于操作顺序如何进入NSOperationQueue addOperationsWithBlock
的基本问题。
我想做什么:
[_queue addOperationWithBlock:^{
//starts a new thread to download an image
//returns a response from the server
if (returnResponse != nil) {
//what I need to accomplish:
//1) Update the collectionViewCell with data
//2) Cache the image locally
//3) Save the image name in local database
}
}];
我不需要代码来执行此操作,我只需要知道它是如何工作的。例如,如果我想立即为用户更新单元格,我是否应该立即拥有这部分代码?
if (returnResponse != nil) {
[[NSOperationQueue mainQueue]addOperationWithBlock^{
//update the cell content on the main Thread
}];
//write data to file, save image name in local database
}
我的主要问题是:这样做,将缓存图像并保存在本地数据库中的那个单独的线程,用于下载图像的线程?如果我颠倒顺序(缓存图像,保存在本地数据库中,然后更新单元格),那会有什么不同吗?
解决方案:
在尝试了许多不同的方法后,我在NSOperationQueue mainQueue
内使用了串行GCD。尽管我最终确定并正确关闭了数据库,但试图保存在sqlite DB中仍然给我一个database is locked
错误。我认为因为它试图同时保存,同时打开一个数据库,另一个查询试图访问它。所以我的最终解决方案看起来像这样:
[_queue addOperationWithBlock:^{
//starts a new thread to download an image
//returns a response from the server
if (returnResponse != nil) {
//Cache the image locally
[[NSOperationQueue mainQueue]addOperationWithBlock^{
//use a created GCD serial queue to save the image name in local database
//update the cell content on the main Thread
}];
}
}];
答案 0 :(得分:0)
如果将操作添加到主队列([NSOperationQueue mainQueue]
),则它将在主队列上发生。
至于步骤的顺序,没有更多细节,没有人可以告诉你。据推测,您正在更新的视图将使用缓存的图像,或者可能是数据库中的图像?如果是这种情况,您可能希望在刷新视图之前更新模型(缓存,数据库)。
答案 1 :(得分:0)
为什么不将GCD与并发队列一起使用? 您可以执行以下操作:
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//execute first
dispatch_sync(concurrentQueue, blockOfCode);
//execute second
dispatch_sync(concurrentQueue, blockOfCode);
//execute third: update the UI
dispatch_sync(dispatch_get_main_queue(), blockOfCodeToUpdateUI);