完成两种方法后如何编写执行方法(ios)

时间:2013-03-03 13:44:23

标签: ios objective-c function

我有两种方法可以在按键点击事件上执行,例如method1:method2:。它们都有网络电话,因此无法确定哪一方先完成。

在完成method1:和method2:

后,我必须执行另一个方法methodFinish
-(void)doSomething
{

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

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

除了典型的start method1:-> completed -> start method2: ->completed-> start methodFinish

之外,我怎样才能做到这一点

阅读有关街区的内容。我对封锁非常新。有人可以帮我写一篇吗?任何解释都会非常有用。谢谢你

3 个答案:

答案 0 :(得分:52)

这是dispatch groups的用途。

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]
});

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

如果要在组完成之前阻止执行,请参阅dispatch_group_wait()

答案 1 :(得分:0)

我从Googles iOS Framework获得的很少的方法,他们非常依赖:

- (void)runSigninThenInvokeSelector:(SEL)signInDoneSel {


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

}

答案 2 :(得分:-7)

你可以使用一个标志(也就是一个BOOL变量),让你知道其中一个方法(A或B)是否已经完成另一个方法。有点像这样:

- (void) methodA
{
    // implementation

    if (self.didFinishFirstMethod) {
        [self finalMethod];
    } else {
        self.didFinishFirstMethod = YES;
    }
}


- (void) methodB
{
    // implementation

    if (self.didFinishFirstMethod) {
        [self finalMethod];
    } else {
        self.didFinishFirstMethod = YES;
    }
}


- (void) finalMethod
{
    // implementation
}

干杯!