セルのコレクションを持つテーブル ビュー コントローラーがあり、各セルには 2 つの値が表示されます。
–––––––––––––––––––––––<br> | セル1 | val1 | val2 |
–––––––––––––––––––––––<br> | セル2 | val1 | val2 |
–––––––––––––––––––––––<br> …</p>
次のようなアルゴリズムを使用して、これらのセルでシリアル同期操作を実行する必要があります。
- コア データのセットアップと tableView UI の更新
- セルを反復する
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 を更新する- 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) が実行されます。
シリアルオーダーを維持するために操作とキューを適切にネストする方法についての提案を探しています。