Iphone 串行操作

Iphone 串行操作,iphone,nsoperation,nsoperationqueue,serial-processing,Iphone,Nsoperation,Nsoperationqueue,Serial Processing,我有一个带有单元格集合的表视图控制器,每个单元格显示2个值: –––––––––––––––––––––––– |单元格1 | val1 | val2| ––––––––––––––––––––––––– |单元格2 | val1 | val2| ––––––––––––––––––––––––– 我需要使用如下算法对这些单元执行串行同步操作: 设置核心数据并更新tableView用户界面 迭代单元格 2.1更新tableViewCell用户界面 2.2迭代值 2.2.1更新值界面 2.2.2

我有一个带有单元格集合的表视图控制器,每个单元格显示2个值:

–––––––––––––––––––––––– |单元格1 | val1 | val2| ––––––––––––––––––––––––– |单元格2 | val1 | val2| –––––––––––––––––––––––––

我需要使用如下算法对这些单元执行串行同步操作:

设置核心数据并更新tableView用户界面 迭代单元格 2.1更新tableViewCell用户界面 2.2迭代值 2.2.1更新值界面 2.2.2下载新值 2.2.2.1如果失败,则重复迭代 2.2.3保存和更新值界面 2.3更新tableViewCell用户界面 保存并更新tableView用户界面 我将NSOperationQueue与NSBlockOperations一起使用:

- (void)startOperation:(id)sender {



    operationQueue = [NSOperationQueue new];
    operationQueue.name = @"Operation Queue";
    operationQueue.maxConcurrentOperationCount = 1;
    [operationQueue waitUntilAllOperationsAreFinished];



    NSBlockOperation * prepareCoreData = [[NSBlockOperation alloc] init];
    [prepareCoreData addExecutionBlock:^{

        NSLog(@"Prepare Core Data");
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            NSLog(@"Update tableView UI");
        }];

    }];
    [operationQueue addOperation:prepareCoreData];





    NSBlockOperation * iterateCells = [[NSBlockOperation alloc] init];
    __weak NSBlockOperation * weakIterateCells = iterateCells;
    [iterateCells addExecutionBlock:^{


        for (Item * item in self.items.fetchedObjects) {



                    if ([weakIterateCells isCancelled]) break;

                    NSBlockOperation * setCellUI = [[NSBlockOperation alloc] init];
                    [setCellUI addExecutionBlock:^{
                        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                            NSLog(@"        Set tableViewCell UI");
                        }];

                    }];
                    [operationQueue addOperation:setCellUI];





                    NSBlockOperation * iterateValues = [[NSBlockOperation alloc] init];
                    __weak NSBlockOperation * weakIterateValues = iterateValues;
                    [iterateValues addExecutionBlock:^{

                            for (SearchEngine * s in self.searchEngines) {

                                    if ([weakIterateValues isCancelled]) break;




                                    NSBlockOperation * setValueUI = [[NSBlockOperation alloc] init];
                                    [setValueUI addExecutionBlock:^{
                                        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                                            NSLog(@"        Set Value UI");
                                        }];

                                    }];
                                    [operationQueue addOperation:setValueUI];



                                    NSBlockOperation * getValue = [[NSBlockOperation alloc] init];
                                    [getValue addExecutionBlock:^{
                                        NSLog(@"        Download Value");
                                    }];
                                    [getValue addDependency:setCellUI];
                                    [operationQueue addOperation:getValue];



                                    NSBlockOperation * updateValue = [[NSBlockOperation alloc] init];
                                    [updateValue addExecutionBlock:^{
                                        NSLog(@"        Save Data");
                                        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                                            NSLog(@"        Update Value UI");
                                        }];

                                    }];
                                    [updateValue addDependency:getValue];
                                    [operationQueue addOperation:updateValue];




                            }



                    }];
                    [iterateValues addDependency:setCellUI];
                    [operationQueue addOperation:iterateValues];



                    NSBlockOperation * updateCellUI = [[NSBlockOperation alloc] init];
                    [updateCellUI addExecutionBlock:^{
                        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                            NSLog(@"        Update tableViewCell UI");
                        }];

                    }];
                    [updateCellUI addDependency:iterateValues];
                    [operationQueue addOperation:updateCellUI];

                };



    }];
    [iterateCells addDependency:prepareCoreData];
    [operationQueue addOperation:iterateCells];





    NSBlockOperation * completeOperation = [[NSBlockOperation alloc] init];
    [completeOperation addExecutionBlock:^{
        NSLog(@"Save Data");
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            NSLog(@"Update tableView UI");
        }];

    }];
    [completeOperation addDependency:iterateCells];
    [operationQueue addOperation:completeOperation];





}
使用此代码,在所有迭代完成之前执行最后一个操作3


我正在寻找关于如何正确嵌套操作和队列以维护序列顺序的建议。

发生的情况是,您创建了太多的队列—不要创建单元格和值迭代队列—也将它们的工作放在operationsQueue上。所有的工作都应该在一个队列中进行!感谢您指出这一点,我更新了代码,但仍然得到相同的结果,3次操作发生在所有迭代完成之前。为什么您要在循环中添加新操作,然后在额外操作中的主线程上添加UI更新?只需在循环内部执行即可。