Iphone 串行操作
我有一个带有单元格集合的表视图控制器,每个单元格显示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一起使用: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
- (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更新?只需在循环内部执行即可。