iOS一个接一个地连续执行方法

时间:2014-10-14 09:31:28

标签: ios objective-c nsoperationqueue

我知道这个类似的问题已被提出但我的问题甚至是使用NSOperationQueue和

  NSOperationQueue *aQueue = [[NSOperationQueue alloc] init];
  [aQueue setMaxConcurrentOperationCount:1];

然后甚至方法也不按顺序执行,即FIFO。

MethodA(花费5秒) - > MethodB(花费2秒) - > MethodC(需要1秒钟)。

如果我把它们放入NSOperationQueue,即

 [aQueue addOperationWithBlock:^{


[self MethodA];

}];

 [aQueue addOperationWithBlock:^{


[self MethodB];

 }];


[aQueue addOperationWithBlock:^{

[self MethodC];

 }];

MethodC首先执行,然后执行A,然后执行B

我希望他们按顺序执行。 MethodA-> MethodB-> Methodc

3 个答案:

答案 0 :(得分:2)

  

接收器不会被认为准备执行直到所有接收器   依赖操作已完成执行。   Source

似乎cfisher所说的依赖关系是倒退的。相反,这些是依赖关系:

  • 方法C依赖于方法B:意味着B必须在C可以启动之前执行
  • 方法B依赖于方法A:意味着A必须在B可以开始之前执行

总而言之,C在B执行之前无法启动,并且由于B在A执行之前无法启动,所以A必须首先执行,然后执行B,然后运行C.

如果你有相互依赖的代码片段,另一种选择是使用块并异步执行代码。

[self methodAWithCompletion:^{
    [self methodBWithCompletion:^{
        [self methodCWithCompletion:nil];
    }];

}];

//sample method A

- (void) methodAWithCompletion:(void(^)(void)completion {
    //your code

    if (completion) {
        completion();
    }
}

答案 1 :(得分:1)

一个选项确实会使用依赖关系,因为Fonix说:MethodA依赖于依赖于MethodC的MethodB。

只需使用dependencies中的NSOperations属性(NSOperation数组)或方法addDependency:

但是,由于您已经在使用块,为什么不使用GCD

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self methodA];
    [self methodB];
    [self methodC];
});

答案 2 :(得分:0)

我认为您需要为您的NSOperations添加依赖项,我不是太过于了解它,而是它在documentation here