ESCObservable 1.0.3

ESCObservable 1.0.3

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最近发布2015年6月

James Rantanen 维护。



  • 作者
  • James Rantanen

实现观察者模式的框架。

相较于使用 NSNotificationCenter 的优点

  • 不需要在 dealloc 中移除观察者(ESCObservable 使用弱引用)
  • 观察者有一个明确定义的可能事件列表(由协议定义)
  • 每个事件都有一个明确定义的参数列表
  • 可以作为参数发送原始类型或 nil
  • 易于使用模拟对象进行测试

使用 ESCObservable

项目设置

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

观察

选项 1 - -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
}

选项 2 - -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
}