TotalObserver 0.7.1

TotalObserver 0.7.1

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布上次发布2016年4月

Pierre Houston 维护。



  • Pierre Houston

一个简化版的 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);
}];

还有一些其他方法:

  • 接受 KVO 选项参数
  • 同时观察多个 KVO 键路径
  • 观察任何对象发布的 NSNotification
  • 观察对象的自身KVO变更或通知
  • 在特定的NSOperationQueue或GCD队列上调用观察块

另外

TotalObserver可以轻松扩展到其他类型的观察。例如,我已经添加了以下功能

UIControl事件

[self to_observeControlForPress:self.button withBlock:^(id obj, TOControlObservation *obs) {
}];

[self.field to_observeEvents:UIControlEventEditingDidBegin withBlock:^(TOControlObservation *obs) {
}];

跨应用程序组Darwin通知

[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文件。