23

我有 2 种方法可以在按钮单击事件上执行,比如说method1:method2:。两者都有网络调用,所以不能确定哪个会先完成。

我必须methodFinish在完成 method1: 和 method2: 后执行另一个方法:

-(void)doSomething
{

   [method1:a];
   [method2:b];

    //after both finish have to execute
   [methodFinish]
}

除了典型的,我怎么能做到这一点start method1:-> completed -> start method2: ->completed-> start methodFinish

阅读有关块的内容..我对块很陌生。有人可以帮我写一个吗?任何解释都会很有帮助。谢谢

4

2 回答 2

52

这就是调度组的用途。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();

// Add a task to the group
dispatch_group_async(group, queue, ^{
  [self method1:a];
});

// Add another task to the group
dispatch_group_async(group, queue, ^{
  [self method2:a];
});

// Add a handler function for when the entire group completes
// It's possible that this will happen immediately if the other methods have already finished
dispatch_group_notify(group, queue, ^{
   [methodFinish]
});

调度组由 ARC 管理。它们由系统保留,直到它们的所有块都运行,因此在 ARC 下它们的内存管理很容易。

另请参阅dispatch_group_wait()是否要阻止执行直到组完成。

于 2013-03-03T14:11:53.807 回答
0

我从 Google 的 iOS 框架中得到的简洁的小方法,他们非常依赖:

- (void)runSigninThenInvokeSelector:(SEL)signInDoneSel {


    if (signInDoneSel) {
        [self performSelector:signInDoneSel];
    }

}
于 2016-05-08T06:54:03.037 回答