В чем разница между уведомлениями, делегатами и протоколами? - PullRequest
3 голосов
/ 19 августа 2011

В чем разница между протоколами или делегатами и NSNotifications? Что такое «Наблюдатель» и как он работает?

Ответы [ 2 ]

30 голосов
/ 19 августа 2011

Протоколы

Документация: Протоколы

Протоколы - это интерфейсы, которые определяют определенные методы, на которые отвечают объекты. Ключевым моментом в протоколах является то, что они могут быть приняты любым классом, гарантируя, что объект отвечает на эти методы.

Если вы объявляете протокол:

@protocol Photosynthesis
@required
- (void)makeFood:(id<Light>)lightSource;
@optional
+ (NSColor *)color; // usually green
@end

Затем вы можете перенять его из других классов, которые не обязательно связаны напрямую:

@interface Plant : Eukaryote <Photosynthesis>
// plant methods...
@end
@implementation Plant
// now we must implement -makeFood:, and we may implement +color
@end

или

@interface Cyanobacterium : Bacterium <Photosynthesis>
// cyanobacterium methods...
@end
@implementation Cyanobacterium
// now we must implement -makeFood:, and we may implement +color
@end

Теперь, в другом месте, мы можем использовать любой из этих классов взаимозаменяемо, если мы заботимся только о соответствии протоколу:

id<Photosynthesis> thing = getPhotoautotroph(); // can return any object, as long as it conforms to the Photosynthesis protocol
[thing makeFood:[[Planet currentPlanet] sun]]; // this is now legal

Делегаты и уведомления

Документация: Шаблоны проектирования какао

Это два способа передачи сообщений между объектами. Основное отличие:

  • с делегатами, один назначенный объект получает сообщение.
  • любое число объектов может получать уведомления при их публикации.

Делегаты обычно реализуются с использованием протоколов: класс обычно имеет что-то вроде

@property (weak) id<MyCustomDelegate> delegate;

, который дает делегату определенный набор методов для реализации. Вы можете использовать

myObject.delegate = /* some object conforming to MyCustomDelegate */;

и тогда объект может отправлять соответствующие сообщения своему делегату. Хороший общий пример см. В протоколе UITableViewDelegate .

Уведомления, с другой стороны, реализуются с использованием NSNotificationCenter . Объект (или несколько объектов) просто добавляет себя в качестве наблюдателя для определенных уведомлений, а затем может получать их, когда они публикуются другим объектом.

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(notificationHappened:)
                                             name:MyCustomNotificationName
                                           object:nil];

Тогда просто реализуй

- (void)notificationHappened:(NSNotification *)notification {
    // do work here
}

И вы можете отправлять уведомления из любого места, используя

[[NSNotificationCenter defaultCenter] postNotificationName:MyCustomNotificationName
                                                    object:self
                                                  userInfo:nil];

И обязательно позвоните removeObserver:, когда закончите!

5 голосов
/ 19 августа 2011

Вы можете найти ответы, выполнив поиск в stackoverflow ...

...