0

セルのコレクションを持つテーブル ビュー コントローラーがあり、各セルには 2 つの値が表示されます。

–––––––––––––––––––––––<br> | セル1 | val1 | val2 |
–––––––––––––––––––––––<br> | セル2 | val1 | val2 |
–––––––––––––––––––––––<br> …</p>

次のようなアルゴリズムを使用して、これらのセルでシリアル同期操作を実行する必要があります。

  1. コア データのセットアップと tableView UI の更新
  2. セルを反復する
    2.1 tableViewCell UI を更新する
    2.2 値を反復する
        2.2.1 値 UI を更新する
        2.2.2 新しい値をダウンロードする
            2.2.2.1 失敗した場合 反復を繰り返す
        2.2.3 値を保存して UI を
    更新する 2.3 tableViewCell UI を更新する
  3. tableView UI の保存と更新

私はNSBlockOperationsでNSOperationQueueを使用しています:

- (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) が実行されます。

シリアルオーダーを維持するために操作とキューを適切にネストする方法についての提案を探しています。

4

0 に答える 0