Block-KVO 2.2.1

Block-KVO 2.2.1

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布上次发布2014年12月

Martin Kiss维护。



Block-KVO 2.2.1

  • Martin Kiss

Block Observing 2.2

概述

使用 blocks 轻松实现 Key-Value Observing。

这是一个 Key-Value Observation 机制扩展,允许您使用 blocks 作为观察处理器。Block Observing 可以与经典 KVO 一起使用而不会出现任何问题。

您应该熟悉 Key-Value ObservingKey-Value Coding 的概念。

本项目中的库和示例应用是针对 iOS 的,但您也可以通过直接导入源文件在 OS X 项目中使用。

要求

  • ARC
  • iOS 5 及更高版本(因为使用了 __weak

集成

  1. 将项目拖入您的项目(作为子项目或同级项目)。
  2. 构建阶段 中将 Block Observing 添加到 目标依赖项
  3. 构建阶段 中将 libBlockObserving.a 添加到 链接二进制与库
  4. -ObjC-all_load 作为 构建设置 中的 其他链接器标志
  5. 确保您已设置 构建设置 中的 头文件搜索路径(例如:Libraries/**)。
  6. MTKObserving.h 导入您的文件(通常在 Prefix.pch 中)。

功能

使用 block 观察

任何对象都可以使用 block 处理器来观察 它自己的 key-path。调用者和接收者必须是相同的对象,并且 key-path 必须相对于接收者。

[self observe:@keypath(self.profile.username) withBlock:
 ^(__weak typeof(self) self, NSString *oldUsername, NSString *newUsername) {
     self.usernameLabel.text = newUsername;
 }];

Block 参数没有特定的类型(所以它们是 id)。您应该根据需要自行指定类型。原始值-wrap 在 NSNumberNSValue 实例中。

快速宏

以上代码示例使用了提供的宏

MTKObservePropertySelf(profile.username, NSString *, {
    self.usernameLabel.text = newUsername;
});

等式检查

注意:这与标准 KVO 不同。

一旦观察属性值发生变化,但如果这些值是相等的(使用-isEqual:方法),则观察块将不会调用。例如self.title = self.title;不会触发观察。

块内不保留循环

所有观察块的第一个参数是接收者/调用者,名称为self。它覆盖了方法参数self,但包含相同的对象。唯一的区别是__weak属性。在上面的示例代码中,你可以使用self而不会引起保留循环。

使用选择器观察

如果你想跳出当前作用域,只需提供选择器而不是代码块。

[self observe:@keypath(self.profile.username) withSelector:@selector(didChangeUsernameFrom:to:)];

一次性观察多个关键路径

有些方法接收一个关键路径数组和一块(或选择器)。

单程绑定(映射)

将属性映射到另一个属性。一旦源关键路径发生变化,目的地会使用新值进行更新。按您想要的任何方式转换值。

[self map:@keypath(self.profile.isLogged) to:@keypath(self.isLoggedLabel.text) transform:
 ^NSString *(NSNumber *isLogged) {
     return (isLogged.boolValue ? @"Logged In" : @"Not Logged In");
 }];

此外,还有一个指定空值替换的便利方法。

[self map:@keypath(self.profile.username) to:@(self.usernameLabel.text) null:@"Unknown"];

双向绑定(映射)

通过使用两个单程绑定可以实现双向绑定。别担心递归,因为如果值相等,将抑制观察。通过这种方式,您可以映射user.nametextField.text,这样它将始终显示名称,然后映射textField.textuser.name以在用户更改后更新名称。

使用块观察NSNotifications

通过块改进了通知的观察。NSNotificationCenter提供了一些支持,但在这里您不必担心移除那些块或保留循环。


MIT许可证,版权(c)2012-2013马丁·基斯

软件按“原样”提供,等等……