Подтвердить что ты не робот

Как написать метод для выполнения после завершения двух методов (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

Читайте о блоках. Я очень новичок в блоках. Может кто-нибудь помочь мне написать один для этого? И любое объяснение будет очень полезно. Спасибо.

4b9b3361

Ответ 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
}

Ура!