Pull to refresh

Comments 18

Супер! Давно пора уже быть с паттернами на «ты» :)
Теперь есть хороший материал для их изучения
Недавно вышла неплохая книга по теме

Pro Objective-C Design Patterns for iOS By Carlo Chung
Знаем такую! Действительно, неплохая. Примеры местами немного надуманные, но это не сильно ее портит.
Приведенный Вами в начале пример интересен только для понимания сути работы нотификаций.
NSNotification гороздо полезнее в плане того, что не нужно объявлять протокол и поддерживать его наблюдателями.
Наблюдатель сам укажет, какой селектор на нем должен быть вызван.
Плюс возможность добавлять аргументы к событию (userInfo)
Пример, конечно, игрушечный. Собственную реализацию иногда писать все же полезно. Скажем, когда разрабатывается библиотека, которой потом будут пользоваться сторонние разработчики. Да и отлаживать проще.

А так — полностью согласен. NSNotification очень удобны, особенно если сообщения нужно отправлять асинхронно.
Либо я ничего не понимаю, либо это ппц.
>>Теперь всякому объекту, которому необходимо знать об успешном прохождении уровня, достаточно реализовать протокол GameStateObserver и подписаться на оповещение об успешном завершении. Соотвествующий код будет выглядеть примерно так:

GameState *gameState = [[GameState alloc] init];
[gameState addObserver:levelManager];
[gameState addObserver:levelViewController];

То есть каждая фигнюшка которая просто хочет узнать об изменении GameState создает в памяти экземпляр класса GameState? У вас получится 40 разных экземпляров GameState?

А объект GameState должен хранить в себе ссылки на все фигнюшки которые на него подписались?

@interface GameState : NSObject {

NSMutableSet *observerCollection;
}


Тут пахнет кривизной либо кода, либо Objective C.
В Java и Java кастартах типа AS3 такие проблемы решаются классом Event.
Не так. Просто в том классе, в котором вам нужно принимать оповещение, вы должны реализовать протокол.
А зачем тогда это?
GameState *gameState = [[GameState alloc] init];
это не реализация протокола, это создание экземпляра класса
Это единый экземпляр. Просто нужно было объявить переменную, вот и втавил строчку кода. Как видно далее, этот объект регистрирует двух наблюдателей.
На практике при использовании NSNotificationCenter вызывается метод
— (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;

На объекте observer вызовется aSelector
Объект создается один раз и хранит ссылки на всех подписчиков. NSNotificationCenter совершенно так же хранит ссылки на всех подписчиков, помня еще и нужный метод (селектор).

В java.util есть класс Observable и интерфейс Observer. Они реализуют паттерн напрямую.
Пользуюсь такой вот реализацией этого паттерна: MulticastDelegate.
Из преимуществ по сравнению с NSNotificationCenter —
1. автоматическая отписка observer-а при его удалении из памяти ( если забыли отписатся от оповещений в методе dealloc — не беда, отписка произойдет автоматически )
2. Поддержка произвольной сигнатуры метода оповещения, то есть можно нотифицировать так —

[ self.observers gameState: self didUpdateScore: self.score ];
Классно рассказано, все просто и понятно!
Паттерны переодически повторяю, но все равно что-то забывается.

Может напишите цикл статей про каждый паттерн из GoF с такими примерами?
Можно и без iOS. Для новичков (и не только) материал ценнейший будет!
Суть вы уловили. Про все паттерны не обещаю, но цикл будет!
В рамках раскрытия темы observer в контексте iOS можно было бы еще вспомнить про паттерн delegate и определить между ними принципиальную разницу.
Когда буду писать про delegate, обязательно сравним! Кстати, GoF не выделяют его в паттерн.
Поддерживаю, прочитал статью и думал зачем же нужен обзервер, если есть делегейт. Хотя если множество объектов и им надо отослать события, тогда наверное лучше обзервер.
Sign up to leave a comment.

Articles