Как написать метод для выполнения после завершения двух методов (ios)
У меня есть 2 метода, которые будут выполняться в событии с нажатием кнопки say method1:
и method2:
. Также есть сетевые вызовы и поэтому не может быть уверен, какой из них будет выполнен первым.
Мне нужно выполнить другой метод methodFinish
после завершения обоих методов1: и method2:
-(void)doSomething
{
[method1:a];
[method2:b];
//after both finish have to execute
[methodFinish]
}
Как я могу достичь этого, кроме типичного start method1:-> completed -> start method2: ->completed-> start methodFinish
Читайте о блоках. Я очень новичок в блоках. Может кто-нибудь помочь мне написать один для этого? И любое объяснение будет очень полезно. Спасибо.
Ответы
Ответ 1
Это то, что для для групп отправки.
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 possible that this will happen immediately if the other methods have already finished
dispatch_group_notify(group, queue, ^{
[methodFinish]
});
Группы отправки управляются ARC. Они сохраняются системой до тех пор, пока все их блоки не запустится, поэтому управление памятью легко под ARC.
См. также dispatch_group_wait()
, если вы хотите заблокировать выполнение, пока группа не закончит.
Ответ 2
Укротимый небольшой метод, который я получил от Googles iOS Framework, они очень сильно полагаются:
- (void)runSigninThenInvokeSelector:(SEL)signInDoneSel {
if (signInDoneSel) {
[self performSelector:signInDoneSel];
}
}
Ответ 3
Вы можете просто использовать флаг (aka BOOL variable), который позволяет вам знать в обоих методах (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
}
Ура!