NSOperationQueue addOperationWithBlock返回mainQueue操作顺序

时间:2014-08-24 12:32:39

标签: ios objective-c nsoperationqueue

我有一个关于操作顺序如何进入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
        }];
    }
}];

2 个答案:

答案 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);