Ios 如何在非并发自定义操作中执行异步任务
也许我让NSOperation在非并发作业中扮演了错误的角色。我的要求是,我想做很多异步工作,但我希望它们按顺序完成。在异步回调之后完成task1后,task2现在就可以开始工作了。我把所有的任务都变成一个Ios 如何在非并发自定义操作中执行异步任务,ios,iphone,Ios,Iphone,也许我让NSOperation在非并发作业中扮演了错误的角色。我的要求是,我想做很多异步工作,但我希望它们按顺序完成。在异步回调之后完成task1后,task2现在就可以开始工作了。我把所有的任务都变成一个NSOperation。然而,NSOperation大部分时间用于多线程编程。我的选择错了吗。但是它提醒我要更多地考虑NSOperation在这种情况下,我们不能在同步块中手动管理isFinished和isExecute,因为操作是在非并发NSOperation中释放的,这意味着我不能使用强大
NSOperation
。然而,NSOperation
大部分时间用于多线程编程。我的选择错了吗。但是它提醒我要更多地考虑NSOperation
在这种情况下,我们不能在同步块中手动管理isFinished
和isExecute
,因为操作是在非并发NSOperation中释放的,这意味着我不能使用强大的操作队列来自动管理任务。有什么想法吗?谢谢你的回答
使用代码编辑:
-(void)main {
[super main];
self.isOperationExcuting = YES;
self.isOperationFinished = NO;
WEAKSELF
[self query:^(NSArray *array, NSError *error) {
//I set my custom property, but it do not cause my NSOperation to be finished
weakSelf.isOperationFinished = YES;
weakSelf.isOperationExcuting = NO;
}];
}
-(void)query:(void (^)(NSArray *array, NSError *error))block {
BmobQuery *query = [BmobQuery queryWithClassName:@"Room"];
[query findObjectsInBackgroundWithBlock:block];
}
-(BOOL)isFinished {
return self.isOperationFinished;
}
- (BOOL)isExecuting {
return self.isOperationExcuting;
}
- (void)start {
[super start];
NSLog(@"start");
}
- (void)cancel {
[super cancel];
NSLog(@"cancel");
}
只需通过将
maxConcurrentOperationCount
设置为1
使所有添加的操作串行化即可
NSOperationQueue* queue = [[ NSOperationQueue alloc ] init];
queue.maxConcurrentOperationCount = 1;
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:operation3];
操作队列
该类控制一组数据的执行
NSO操作对象。将操作添加到队列后
保留在该队列中,直到显式取消或完成
执行它的任务
只需通过将
maxConcurrentOperationCount
设置为1
使所有添加的操作串行化即可
NSOperationQueue* queue = [[ NSOperationQueue alloc ] init];
queue.maxConcurrentOperationCount = 1;
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:operation3];
操作队列
该类控制一组数据的执行
NSO操作对象。将操作添加到队列后
保留在该队列中,直到显式取消或完成
执行它的任务
想想看,您要找的是一个
NSOperationQueue
,其中maxConcurrentOperationCount
设置为1。想想看,您要找的是一个NSOperationQueue
,其中maxConcurrentOperationCount
设置为1。我的目标是:[operation1 completionBlock:^(){[operation2 completionBlock:^(){[operation3 completionBlock:^(){}];}]
;}];你有什么理由需要在它们的完成处理程序中链接操作吗?是的。。。我必须在上一个操作的完成处理程序中启动一个操作。。这样我就可以连续地做这项工作了。NSOperation是否不正确?NSOperation
是正确的,但不是在完成处理程序中启动操作,而是创建一个NSOperationQueue
并将操作添加到那里。当您将maxConcurrentOperationCount
设置为1
时,您的操作将按照您的需要一个接一个地连续运行。好的,现在我知道了。可以通过在操作之间创建依赖关系来实现这一点。有addDependency:
方法的NSOperation
。我还将子类化NSOperation
,并添加用于在操作之间传递数据的dictionary属性。检查这个问题我的目标是:[operation1 completionBlock:^(){[operation2 completionBlock:^(){[operation3 completionBlock:^(){}];}]
;}];你有什么理由需要在它们的完成处理程序中链接操作吗?是的。。。我必须在上一个操作的完成处理程序中启动一个操作。。这样我就可以连续地做这项工作了。NSOperation是否不正确?NSOperation
是正确的,但不是在完成处理程序中启动操作,而是创建一个NSOperationQueue
并将操作添加到那里。当您将maxConcurrentOperationCount
设置为1
时,您的操作将按照您的需要一个接一个地连续运行。好的,现在我知道了。可以通过在操作之间创建依赖关系来实现这一点。有addDependency:
方法的NSOperation
。我还将子类化NSOperation
,并添加用于在操作之间传递数据的dictionary属性。看看这个问题