ContextObserver
这是一个小型库,用于管理 CoreData 通知,以便在 NSManagedObject 被插入、删除或更新时更新用户界面。
ContextObserver 工作原理与 NSFetchedResultsController 类似,即通过观察管理对象上下文的 NSManagedObjectContextObjectsDidChangeNotification。
每当发生更改事件时,都会调用一个块,允许您相应地更新您的用户界面。
需求
ContextObserver 支持 iOS 7.0 以及更高版本。但是,为了使用此库的 CocoaPods 版本,需要 iOS 8.0。ContextObserver 还与 Mac OS X 10.9 或更高版本兼容。
通过 CocoaPods 安装
使用 ContextObserver 的首选方法是通过 CocoaPods。只需将以下行添加到您的 Podfile 中。
pod 'ContextObserver', '~> 3.0.1'
手动安装
只需将 Classes 子目录中的所有文件拖到您的项目中,并确保所有 Swift 源代码文件都已添加到您的目标中。
示例
基本用法
let observer = ContextObserver(context: myManagedObjectContext)
observer.add().block { [weak self] (object: NSManagedObject, type: EventType, keys: [String]) in
self?.updateUI()
}
这创建了一个ContextObserver的实例,并注册了一个单个处理器,它的闭包将在给定NSManagedObjectContext中的任何对象更改、插入或删除时被调用。类型参数表示是否有更新、插入或删除。对于更新事件,受影响的关键路径作为键参数传递。键数组对于插入和删除为空。
过滤器
在大多数情况下,基本用法示例并不是你想要的样子。现实世界中的应用程序通常包含相当多的不同CoreData实体,以及可能的大量NSManagedObject实例。在上面的示例中,你的NSManagedObjectContext中的每一个变化都会触发处理器的闭包,然后更新你的UI。这就是过滤器出现的地方。
事件类型过滤器
observer.add().filter(.Inserted | .Deleted).block { [weak self] object, type, keys in
self?.updateUI()
}
将EventType.Inserted、EventType.Deleted或EventType.Updated传递给过滤器方法,以便只为所需的事件类型调用闭包。
实体过滤器
observer.add().filter(Profile.self).block { [weak self] object, type, keys in
self?.updateUI()
}
observer.add().filter(Profile.self, predicate: NSPredicate(format: "accountId = 1")).block { [weak self] object, type, keys in
self?.updateUI()
}
observer.add().filter([Account.self, Event.self]).block { [weak self] object, type, keys in
self?.updateUI()
}
您可以将实体类或实体类的数组传递给过滤器方法,以便只为给定类中的对象的变化调用闭包。还可以指定一个谓词以执行其他过滤。
实例过滤器
observer.add().filter(user).block { [weak self] object, type, keys in
self?.updateUI()
}
observer.add().filter([user1, user2]).block { [weak self] object, type, keys in
self?.updateUI()
}
您可以使用NSManagedObject类的实例来调用过滤方法,以便只有修改给定对象的更改会调用闭包。
忽略属性
通常您想要排除特定属性以供观察,即对于一组给定属性的更改不应触发观察者。有两种方法可以实现此行为
基于实体的忽略属性
您可以通过让您的NSManagedObject子类遵守可观察协议来标记一组任意的属性为非观察。
class User: NSManagedObject, Observable {
var ignoredKeysForObservation = ["lastUpdated"]
@NSManaged var username: String
@NSManaged var email: String
@NSManaged var lastUpdated: Date
}
每个观察者的忽略属性
调用ignoredKeys方法并传递一个包含要忽略的属性的数组,以防止您的闭包在更改给定属性时被调用。
observer.add().filter(User.self).ignoredKeys(["lastUpdated"]).block { [weak self] object, type, keys in
self?.updateUI()
}