我有两种方法可以在按键点击事件上执行,例如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
阅读有关街区的内容。我对封锁非常新。有人可以帮我写一篇吗?任何解释都会非常有用。谢谢你
答案 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
}
干杯!