ContextObserver 3.0.1

ContextObserver 3.0.1

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最新发布2018年8月
SPM支持 SPM

由 Kai Straßmann 维护。



  • Kai Straßmann

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()
}