Комментарии 18
Супер! Давно пора уже быть с паттернами на «ты» :)
Теперь есть хороший материал для их изучения
Теперь есть хороший материал для их изучения
0
Недавно вышла неплохая книга по теме
Pro Objective-C Design Patterns for iOS By Carlo Chung
Pro Objective-C Design Patterns for iOS By Carlo Chung
+3
Приведенный Вами в начале пример интересен только для понимания сути работы нотификаций.
NSNotification гороздо полезнее в плане того, что не нужно объявлять протокол и поддерживать его наблюдателями.
Наблюдатель сам укажет, какой селектор на нем должен быть вызван.
Плюс возможность добавлять аргументы к событию (userInfo)
NSNotification гороздо полезнее в плане того, что не нужно объявлять протокол и поддерживать его наблюдателями.
Наблюдатель сам укажет, какой селектор на нем должен быть вызван.
Плюс возможность добавлять аргументы к событию (userInfo)
0
Пример, конечно, игрушечный. Собственную реализацию иногда писать все же полезно. Скажем, когда разрабатывается библиотека, которой потом будут пользоваться сторонние разработчики. Да и отлаживать проще.
А так — полностью согласен. NSNotification очень удобны, особенно если сообщения нужно отправлять асинхронно.
А так — полностью согласен. NSNotification очень удобны, особенно если сообщения нужно отправлять асинхронно.
0
Может пригодится (если кто еще не видел): Cocoa Design Patterns
+2
Либо я ничего не понимаю, либо это ппц.
>>Теперь всякому объекту, которому необходимо знать об успешном прохождении уровня, достаточно реализовать протокол GameStateObserver и подписаться на оповещение об успешном завершении. Соотвествующий код будет выглядеть примерно так:
То есть каждая фигнюшка которая просто хочет узнать об изменении GameState создает в памяти экземпляр класса GameState? У вас получится 40 разных экземпляров GameState?
А объект GameState должен хранить в себе ссылки на все фигнюшки которые на него подписались?
>>Теперь всякому объекту, которому необходимо знать об успешном прохождении уровня, достаточно реализовать протокол 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.
0
Не так. Просто в том классе, в котором вам нужно принимать оповещение, вы должны реализовать протокол.
0
А зачем тогда это?
это не реализация протокола, это создание экземпляра класса
GameState *gameState = [[GameState alloc] init];
это не реализация протокола, это создание экземпляра класса
0
Это единый экземпляр. Просто нужно было объявить переменную, вот и втавил строчку кода. Как видно далее, этот объект регистрирует двух наблюдателей.
0
На практике при использовании NSNotificationCenter вызывается метод
— (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;
На объекте observer вызовется aSelector
— (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;
На объекте observer вызовется aSelector
0
Объект создается один раз и хранит ссылки на всех подписчиков. NSNotificationCenter совершенно так же хранит ссылки на всех подписчиков, помня еще и нужный метод (селектор).
В
В
java.util
есть класс Observable
и интерфейс Observer
. Они реализуют паттерн напрямую.0
Пользуюсь такой вот реализацией этого паттерна: MulticastDelegate.
Из преимуществ по сравнению с NSNotificationCenter —
1. автоматическая отписка observer-а при его удалении из памяти ( если забыли отписатся от оповещений в методе dealloc — не беда, отписка произойдет автоматически )
2. Поддержка произвольной сигнатуры метода оповещения, то есть можно нотифицировать так —
Из преимуществ по сравнению с NSNotificationCenter —
1. автоматическая отписка observer-а при его удалении из памяти ( если забыли отписатся от оповещений в методе dealloc — не беда, отписка произойдет автоматически )
2. Поддержка произвольной сигнатуры метода оповещения, то есть можно нотифицировать так —
[ self.observers gameState: self didUpdateScore: self.score ];
0
Классно рассказано, все просто и понятно!
Паттерны переодически повторяю, но все равно что-то забывается.
Может напишите цикл статей про каждый паттерн из GoF с такими примерами?
Можно и без iOS. Для новичков (и не только) материал ценнейший будет!
Паттерны переодически повторяю, но все равно что-то забывается.
Может напишите цикл статей про каждый паттерн из GoF с такими примерами?
Можно и без iOS. Для новичков (и не только) материал ценнейший будет!
0
В рамках раскрытия темы observer в контексте iOS можно было бы еще вспомнить про паттерн delegate и определить между ними принципиальную разницу.
+1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Паттерны проектирования для iOS разработчиков. Observer, часть I