2013-03-03 33 views
23

我有2个方法在按钮单击事件上执行,说method1:method2:。都有网络调用,所以不能确定哪一个会先完成。如何编写完成两种方法后执行的方法(ios)

我完成这两个方法1之后执行的另一种方法methodFinish:和method2:

-(void)doSomething 
{ 

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

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

我如何能实现比一般start method1:-> completed -> start method2: ->completed-> start methodFinish

阅读本其他有关blocks..I很新的可以有人帮我写一个这个吗?任何解释将是非常有用的。谢谢

+2

这是块是。 – 2013-03-03 13:46:15

回答

51

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

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

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

+1

谢谢,有人怀疑。我的方法里面包含块实现(Restkit Post和get方法),它会受到任何方式的影响吗? – 2013-03-03 14:43:08

+1

这是没有问题的。块可以在其他块内部自由运行,并且队列可以自由调度在其他(或相同)队列上运行的东西。内部实现细节在这里不应该影响你。 – 2013-03-03 19:14:12

-6

你可以只使用一个标志(aka一个布尔变量),让你知道在任何方法(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 
} 

干杯!

+4

我想避免循环和布尔 – 2013-03-03 15:13:04

+3

如果你有1000个方法呢? :) – 2014-07-10 01:03:38

+0

这是疯狂的编码范例: - | – Mehdi 2016-08-08 05:55:06

0

整洁的小方法,我从他们依靠漂亮的大量谷歌iOS的框架有:

- (void)runSigninThenInvokeSelector:(SEL)signInDoneSel { 


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

} 
+0

如何从另一个方法调用该方法? 'runSigninThenInvokeSelector:(SEL)signInDoneSel'? – 2016-07-09 18:13:49