Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在非并发自定义操作中执行异步任务_Ios_Iphone - Fatal编程技术网

Ios 如何在非并发自定义操作中执行异步任务

Ios 如何在非并发自定义操作中执行异步任务,ios,iphone,Ios,Iphone,也许我让NSOperation在非并发作业中扮演了错误的角色。我的要求是,我想做很多异步工作,但我希望它们按顺序完成。在异步回调之后完成task1后,task2现在就可以开始工作了。我把所有的任务都变成一个NSOperation。然而,NSOperation大部分时间用于多线程编程。我的选择错了吗。但是它提醒我要更多地考虑NSOperation在这种情况下,我们不能在同步块中手动管理isFinished和isExecute,因为操作是在非并发NSOperation中释放的,这意味着我不能使用强大

也许我让NSOperation在非并发作业中扮演了错误的角色。我的要求是,我想做很多异步工作,但我希望它们按顺序完成。在异步回调之后完成task1后,task2现在就可以开始工作了。我把所有的任务都变成一个
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属性。看看这个问题