2016-01-21 3 views
0

У меня есть класс A, который задан как делегат для класса B. Как это работает в настоящее время, метод из класса A использует экземпляр класса B для вызова метода. После выполнения метода B он вызывает метод делегирования, реализованный в A.Как использовать блок завершения с делегатом

Что требуется, если метод класса А включает блок завершения успеха, так что, когда его метод B выполняется, я мог бы знать из тот же метод в классе A, что метод B успешно выполнен. Это можно сделать?

ответ

0

В классе A храните блок как собственность. В методе делегата класса B (реализуемый классом A) вы можете вызвать блок через свойство.

@property (nonatomic, copy) void (^completion)(BOOL); 

- (void)classAMethod:(void (^)(BOOL))completion { 
    self.completion = completion; 
    [classB method]; 
} 

- (void)classBDelegateMethod:(BOOL)result { 
    if(self.completion) { 
     self.completion(result); 
    } 
} 
+0

Вы хотите проверить, что 'завершение' является не -nil' перед вызовом его в' -classBDelegateMethod', иначе приложение будет аварийно завершено. Вы также можете убедиться, что вы не переопределяете существующий блок в '-classAMethod:', иначе блоки могут не вызываться, как ожидалось. Вы можете захотеть сохранить массив блоков. –

+0

Обновлен ответ. Что касается массива завершений, это зависит от характера метода classAMethod. Вы можете позволить ему запускать несколько раз параллельно или выполнять одно исполнение одновременно. Если это первый, массив дополнений имеет смысл. – Mark

+0

@Mark Я думаю, что это то, что я ищу. Как мне изменить его, если я хочу передать BOOL моему классуBDelegateMethod, чтобы classAMethod получил его? – iamarnold

Смежные вопросы