KVOWithBlocks 1.1.0

KVOWithBlocks 1.1.0

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

未指明的维护。



  • 作者
  • Abizer Nasir

NSObject的一个分类,允许你通过传递一个快照来观察keypath的变化,并在keypath变化时执行,而不是使用回调方法。

适用于iOS和OS X。

为什么要这样做?快照很酷。它们允许你同时设置观察和定义一个动作。在大多数情况下,这会使代码比使用回调更加清晰。

依赖项

  • ARC。本项目是为ARC项目编写的,没有宏可以优雅地处理在MRC或GC应用程序中使用它的情况
  • 由于它需要ARC,它需要OS X 10.7和iOS 4。

安装

Git子模块

如果您只想通过子模块将此类别包含到您的项目中,请确保添加master分支作为子模块。原因是本文档中进一步描述的。

直接添加分类

您只需直接将NSObject+JCSKVOWithBlocks.hNSObject+JCSKVOWithBlocks.m文件添加到您的项目中即可,但其他两种方法更可取。

使用方法

很简单,此类别只提供了三种方法

jcsAddObserverForKeyPath:options:queue:block

这是注册观察者主方法。它接受一个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]);
}];

jcsAddObserverForKeyPath:withBlock

这是一个便利方法,它会在调用队列上运行提供的快照。选项是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]);
}];

jcsRemoveObserver

这用于使用注册时返回的不可见引用来删除观察对象。至少应该在dealloc方法中执行此操作。尝试取消已取消注册的观察者是安全的。

示例

// Assuming an iVar: id _observer
- (void)dealloc {
    [self jcsRemoveObserver:_observer];
}

示例

开发分支(分支结构如下所述)包含一个Xcode工作空间,其中包含两个示例项目,展示了对阻塞和非阻塞观察者的简单观察。

子模块的分支结构

此存储库有两个分支,masterdevelopment,这使得在开发和共享代码作为Git子模块时使用同一个存储库变得容易。

master分支

master分支只包含类分类和此README文件。如果您想将其作为子模块添加到您的项目中,应使用该分支。应将此分支视为只读分支。不要在此分支上进行任何开发

development分支

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)

标准的MIT许可证。

我不需要署名,这只是一小段代码。灵感来自创作自己的基于块替换。

致谢

基于

我对从他们那里取喜欢的部分表示道歉。