一个简化版的 Objective-C API,用于使用 NSNotifications 和 KVO,并具有一致性的术语和有用的便捷功能。
仅使用区块,但与 NSNotification 的区块 API 不同,它允许使用匹配的参数进行删除,而不是要求存储观察对象。支持在观察者或被观察者被回收时自动删除。可选地可以省略所有分类方法中的“to_”前缀。
可扩展到其他类型的观察者,包括用于 UIControl 事件操作的包装器,以及用于应用组间 darwin 通知的封装。
TotalObserver 的功能集深受 MAKVONotificationCenter 的影响,并采用了其自动删除的稳固解决方案。应用组通知的灵感来自 MMWormhole。
用 Objective-C 编写,但也测试过从 Swift 中使用的情况。
大多数外部类、属性和方法都有文档说明,但可能还需要一些校对和改进。目前尝试使用 jazzy 生成文档受阻于其 问题 #158,遗憾的是。
欢迎 pull request。
使用以下方式之一导入:`#import <TotalObserver/TotalObserver.h>` 或 `@import TotalObserver;`。
有两种观察方法的通用样式:一种是传入一个观察者(通常是 self),另一种是省略观察者以简短代码,当它不必要时不使用。在这两种情况下,最终区块参数在观察被触发时都会调用。
您可以什么都不做,当您的观察者或被观察对象被回收时,观察将自动删除。不需要在 `dealloc` 中添加删除代码,不需要保留从观察方法返回的 `TOObservation` 结果。
如果您想显式删除观察,可以在所有操作后保留观察方法的输出,并在其上调用 `remove`。但您也可以使用 `stopObserving` 对象方法,该方法(就像 `-[NSNotificationCenter removeObserver:name:object:]`)需要与提供给 `observe` 相同的参数,将找到正确的观察并删除。
TOObservation *o1 = [self to_observeForChanges:object toKeyPath:@"name" withBlock:^(id obj, TOKVOObservation *obs) {
NSLog(@"observed change to object's name parameter!");
}];
TOObservation *o2 = [object to_observeChangesToKeyPath:@"flag" withBlock:^(TOKVOObservation *obs) {
NSLog(@"observed change to object's flag parameter!");
}];
TOObservation *o3 = [self to_observeForNotifications:object named:@"Banana" withBlock:^(id obj, TONotificationObservation *obs) {
NSLog(@"observed object posting Banana notification");
}];
TOObservation *o4 = [object to_observeNotificationsNamed:@"Seaweed" withBlock:^(TONotificationObservation *obs) {
NSLog(@"observed object posting Seaweed notification");
}];
...
[self to_stopObservingForChanges:object toKeyPath:@"name"];
[o4 remove];
当您提供了观察者对象时,该对象作为第一个参数传递给你的区块。您可以使用此来避免创建自己的弱 self 指针。在区块定义中将该参数的类型专用化为您期望的类型,从而避免不必要的类型转换。
[self to_observeForChanges:object toKeyPath:@"name" withBlock:^(ViewController *obj, TOKVOObservation *obs) {
[obj handleNameChange];
}];
区块的第二个参数是观察对象,与 `observe` 方法的输出相同。不仅可以在该对象上调用 `remove`,而且它有权访问所有观察详情,如通知对象或更改字典。
[self to_observeForChanges:object toKeyPath:@"name" withBlock:^(id obj, TOKVOObservation *obs) {
NSLog(@"%@ %@ %d %@ %@", obs.changeDict, obs.keyPath, (int)obs.kind, obs.oldValue, obs.changedValue);
}];
[self to_observeForNotifications:object named:@"Cheesecake" withBlock:^(id obj, TONotificationObservation *obs) {
NSLog(@"%@ %@ %@", obs.notification, obs.postedObject, obs.userInfo);
}];
还有一些其他方法:
NSNotification
TotalObserver可以轻松扩展到其他类型的观察。例如,我已经添加了以下功能
[self to_observeControlForPress:self.button withBlock:^(id obj, TOControlObservation *obs) {
}];
[self.field to_observeEvents:UIControlEventEditingDidBegin withBlock:^(TOControlObservation *obs) {
}];
[TOAppGroupObservation registerAppGroup:groupId];
[self to_observeAppGroupNotificationsNamed:@"name" withBlock:^(id obj, TOControlObservation *obs) {
// called with latest post
NSLog(@"%@", obs.payload);
}];
[self to_observeReliablyAppGroupNotificationsNamed:@"updates" withBlock:^(id obj, NSArray *observations) {
// called with all posts made between last observation
// even if app was inactive or quit in the meantime
}];
[self.data to_postWithinAppGroupNotificationNamed:@"x"];
TotalObserver可通过CocoaPods使用。要安装,只需将以下行添加到您的Podfile中
pod "TotalObserver"
或者,您可以通过在Podfile中添加以下行,启用简写方法,从而省略category方法名称中的to_
前缀(受MagicalRecord启发)
pod "TotalObserver/Shorthand"
并且,在您的应用程序启动过程中,例如某个+load
方法或应用程序代理的application:didFinishLaunching...
方法中,添加此类方法调用
[TOObservation setupShorthandMethods];
有关详细信息,请参阅“TotalObserverShorthand.h”中的注释。
如果使用pod try
或手动克隆源代码以尝试Example应用程序,则必须首先将cd
到Example目录并执行pod install
,然后按照指示打开TotalObserver.xcworkspace
而不是.xcodeproj
文件。注意,示例项目还有一个基于静态框架构建的第二个目标。
Pierre Houston, [email protected]
TotalObserver在MIT许可下可用。有关更多信息,请参阅LICENSE文件。