实现观察者模式的框架。
相较于使用 NSNotificationCenter 的优点
ESCObservable 可以作为子项目导入到 Xcode 中,或作为 .framework 格式。可以使用 Build Framework
目标构建 .framework。
在 其他链接器标志
下的构建设置中添加 -ObjC
和 -all_load
。
事件在一个或多个协议中声明。
// An example of a protocol that might be used
@protocol ExampleObjectObserver
@optional // all methods will be treated as optional by ESCObservable regardless of the @optional keyword
- (void)eventWithNoParameters;
- (void)eventWithObjectParameter:(NSString *)string primitiveParameter:(NSInteger)integer;
@end
要发送事件,您必须声明哪些协议声明了您将事件的方法(通常在 -init 中)。只需在您的 escNotifier 上调用该方法即可发布事件。
// ExampleObject.h
@interface ExampleObject : NSObject<ESCObservable>
@end
// ExampleObject.m
@interface ESCTestObservable()<ESCObservableInternal>
@end
@implementation ESCTestObservable
- (id)init {
if (self = [super init]) {
[self escRegisterObserverProtocol:@protocol(ExampleObjectObserver)];
}
return self;
}
- (void)sendExampleEvents {
// send event to all observers
[self.escNotifier eventWithNoParameters];
// send event with parameters to all observers
[self.escNotifier eventWithObjectParameter:@"The Answer" primitiveParameter:42];
}
@end
-escAddObserver:
使用 -escAddObserver: 添加观察者将注册对象以接收所有事件。如果对象没有实现协议上的方法,则该方法将简单地不被调用(未实现的方法不会导致崩溃)。
// ExampleObserver1.m
- (instancetype)initWithExampleObject:(ExampleObject *)exampleObject {
if (self = [super init]) {
[exampleObject escAddObserver:self];
}
return self;
}
- (void)eventWithNoParameters {
// do stuff based on the eventWithNoParameters event
}
- (void)eventWithObjectParameter:(NSString *)string primitiveParameter:(NSInteger)integer {
// do stuff based on the eventWithObjectParameter:primitiveParameter: event
}
-escAddObserver:forSelector:
和 -escAddObserver:forSelector:forwardingToSelector
使用 -escAddObserver:forSelector:
或 -escAddObserver:forSelector:forwardingToSelector
添加观察者将注册对象以接收仅指定的事件。如果使用后者,当事件发生时将调用 forwardingToSelector。如果使用 forwardToSelector,方法签名必须匹配。
// ExampleObserver2.m
- (instancetype)initWithExampleObject:(ExampleObject *)exampleObject {
if (self = [super init]) {
[exampleObject escAddObserver:self forSelector:@selector(eventWithNoParameters)];
[exampleObject escAddObserver:self forSelector:@selector(eventWithObjectParameter:primitiveParameter:) forwardToSelector:@selector(forwardingExampleWithString:integer:)];
}
return self;
}
- (void)eventWithNoParameters {
// do stuff based on the eventWithNoParameters event
}
- (void)forwardingExampleWithString:(NSString *)string integer:(NSInteger)integer {
// do stuff based on the eventWithObjectParameter:primitiveParameter: event
}