2015-10-24 3 views
1

Я ищу хороший образец для такой ситуации. Давайте будем иметь класс с делегатом:Как реализовать два делегата одного типа в одном классе?

@protocol MyDelegate 
-(void) someEvent; 
@end 

@interface MyServiceClass 
@property (nonatomic,weak) id<MyDelegate> delegate; 
@end 

И у нас есть два экземпляра этого класса. Например, serviceObject1 и serviceObject2. Теперь в нашем контроллере мы хотим получать события от обоих случаях:

-(void) registerDelegates { 
    serviceObject1.delegate=self; 
    serviceObject2.delegate=self; 
} 

-(void) someEvent { 
    // do something 
} 

Все хорошо, за исключением, что события обоих случаях будут выброшены на один метод someEvent. Для меня будет удобнее отделять события от serviceClass1 и serviceClass2 до разных методов.

Я видел три подхода, но не нравится ни один из них:

  1. Отправить экземпляр звонящих в качестве аргумента someEvent и проверить, из которого экземпляра этого события и перенаправить к соответствующему методу.
  2. Создайте два поддельных объекта в моем контроллере и зарегистрируйте их как делегаты service1Class. И из этих объектов вызывают разные методы в моем контроллере.
  3. Используйте анонимные блоки вместо делегатов. Хорошее решение, но я не знаю, как их отменить.

Возможно, существует другое решение, которое я пропустил?

+0

Возможно. Вы недовольны вариантом 1? Выглядит хорошо. –

+0

Отправить экземпляр вызывающего абонента - это правильный способ сделать. Вот как это делает Apple, например 'tableView: cellForRowAtIndexPath:'. – kientux

ответ

3

Способ, которым это обрабатывается, заключается в передаче экземпляра MyServiceClass в качестве одного из параметров метода, в основном того, что вы написали для # 1.

Вот как это делает Apple, и это обычная практика.

@protocol MyDelegate 
-(void) someEventFromService:(MyServiceClass *serviceClass); 
@end 
+0

Согласен. Стандартная практика, вот как вы должны это делать. Вы можете просто использовать этот метод для тестирования и отправки на два отдельных метода, если это сделает ваш код более чистым. – deadbeef

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