为Objective-C实现的EventEmitter,尽可能地实现了NodeJS EventEmitter API。
该库向NSObject添加了一个类别,允许任何对象使用 emit
(发出)或 listen
(监听)事件。
将它作为Cocoapods依赖项添加到您的Podfile中
pod 'Emitter'
在任何对象上注册一个事件监听器
#import <EventEmitter/EventEmitter.h>
NSObject *server = [[NSObject alloc] init];
[server on:@"connection" listener:^(id stream) {
NSLog(@"someone connected!");
}];
[server once:@"connection" listener:^(id stream) {
NSLog(@"Ah, we have our first user!");
}];
稍后,向同一对象发起一个事件
[server emit:@"connection", stream];
[server emit:@"event", @{
@"type": @"somethinghappened",
@"another key": @"another value",
}];
您可以使用以下方式监听事件:
- (void)addListener:(NSString *)event listener:(id)listener;
- (void)on:(NSString *)event listener:(id)listener;
- (void)once:(NSString *)event listener:(id)listener;
停止监听:
- (void)removeListener:(NSString *)event listener:(id)listener;
- (void)removeAllListeners:(NSString *)event;
使用以下方式发出事件:
- (void)emit:(NSString *)event, ...;
您还可以使用选择器和目标对象通过以下方式监听事件:
- (void)addListener(NSString *)event selector:(SEL)selector target:(id)target;
- (void)on:(NSString *)event selector:(SEL)selector target:(id)target;
- (void)once:(NSString *)event selector:(SEL)selector target:(id)target;
停止监听:
- (void)removeListener:(NSString *)event selector:(SEL)selector target:(id)target;
- (void)removeAllListeners:(NSString *)event;
您提供的任何回调块将以正确的参数被调用(我们使用了BlocksKit以动态调用回调块)。
这意味着您可以发出具有任意数量参数的事件,例如:
[object emit:@"event", @"hello", @123, NO, @{ @"key": @"value" }];
可以通过以下方式监听它们:
[object on:@"event", ^(NSString *param1, NSNumber *param2, BOOL param3, NSDictionary *param4){
NSLog(@"Every parameter was passed correctly!");
}];
原始想法来源于jerolimov的EventEmitter,并扩展以支持动态块参数和用于发出事件的单个方法。