NSObject的一个分类,允许你通过传递一个快照来观察keypath的变化,并在keypath变化时执行,而不是使用回调方法。
适用于iOS和OS X。
为什么要这样做?快照很酷。它们允许你同时设置观察和定义一个动作。在大多数情况下,这会使代码比使用回调更加清晰。
如果您只想通过子模块将此类别包含到您的项目中,请确保添加master分支作为子模块。原因是本文档中进一步描述的。
您只需直接将NSObject+JCSKVOWithBlocks.h
和NSObject+JCSKVOWithBlocks.m
文件添加到您的项目中即可,但其他两种方法更可取。
很简单,此类别只提供了三种方法
这是注册观察者主方法。它接受一个keyPath和选项,如通常用于注册KVO观察,但还接受一个NSOperationQueue和一个快照。在观察到keypath变化时,会在队列上运行快照。如果队列为nil,则快照在调用线程上运行。
该快照没有返回值,且传递给观察变化字典。它被定义为
typedef void (^jcsObservationBlock)(NSDictionary *change);
在注册观察时,返回一个不透明的对象引用,用于注销观察。
示例
// Assume you have an iVar: id _observer to hold the opaque reference
NSOperationQueue *queue = [NSOperationQueue new];
_observer =
[self jcsAddObserverForKeyPath:@"self.stringProperty" options:NSKeyValueObservingOptionNew queue:queue block:^(NSDictionary *change) {
NSLog(@"New string value %@", [change objectForKey:NSKeyValueChangeNewKey]);
}];
这是一个便利方法,它会在调用队列上运行提供的快照。选项是NSKeyValueObservingOptionNew
,因此更改字典具有关键为NSKeyValueChangeNewKey
。
在注册此观察时,会返回一个不可见的对象引用,该引用用于取消注册观察。
示例
// Assume you have an iVar: id _observer to hold the opaque reference
_observer =
[self jcsAddObserverForKeyPath:@"self.stringProperty" withBlock:^(NSDictionary *change) {
NSLog(@"New string value %@", [change objectForKey:NSKeyValueChangeNewKey]);
}];
这用于使用注册时返回的不可见引用来删除观察对象。至少应该在dealloc
方法中执行此操作。尝试取消已取消注册的观察者是安全的。
示例
// Assuming an iVar: id _observer
- (void)dealloc {
[self jcsRemoveObserver:_observer];
}
开发分支(分支结构如下所述)包含一个Xcode工作空间,其中包含两个示例项目,展示了对阻塞和非阻塞观察者的简单观察。
此存储库有两个分支,master和development,这使得在开发和共享代码作为Git子模块时使用同一个存储库变得容易。
master分支只包含类分类和此README文件。如果您想将其作为子模块添加到您的项目中,应使用该分支。应将此分支视为只读分支。不要在此分支上进行任何开发。
development分支包含类别文件以及用于开发和演示的Xcode项目。这是进行开发的分支,通过仔细合并的魔力,干净地将更改推回master分支。
要添加development分支而不是master分支,只需在克隆时使用-b标志,如下所示。
git submodule add -b development
https://github.com/Abizern/KVOWithBlocks.git
在Mac OS X和iOS项目中,每个类别都有单元测试,但这些测试是在两个项目中共享的。
在从master切换到development时,有时可能会留下一些工艺品。这些是Git忽略的文件,可以通过运行以下命令轻松清理:
git clean -dxf
标准的MIT许可证。
我不需要署名,这只是一小段代码。灵感来自创作自己的基于块替换。
基于
我对从他们那里取喜欢的部分表示道歉。