测试已测试 | ✓ |
Lang语言 | Obj-CObjective C |
许可证 | MIT |
发布最后发布 | 2015年12月 |
由 Hirad Motamed 维护。
PLFetchedObjectsController
对需要类似 NSFetchedResultsController
但更接近底层功能的场景非常有用。它与 UITableView
的绑定不是很紧密,其代理通知也不提及 NSIndexPath
。它只提供您的对象,并允许您使用这些对象做任何事情(也许您想在表格视图中使用对象,而 NSFetchedResultsController
不支持这种方式)。它部分受到 Marcus Zarra 的 ZSContextWatcher
的启发。
使用获取对象控制器类似于使用 NSFetchedResultsController
。步骤如下:
PLFetchedObjectsController
。loadObjects
执行初始获取并开始监听更改。以下是一个您可能想使用它的例子。假设您在 NSManagedObject
上有一个属性(称为 syncStatus
),它告诉您一个对象是否已被用户修改,因此需要上传到您的服务器。您可能创建一个“上传管理器”类,该类需要知道它需要上传哪些对象
-(void)initializeFetchedObjectsController {
NSFetchRequest *fetchRequest = [NSFetchRequest requestForEntityName:@"UploadableEntity"];
NSPredicate *needsUploadPredicate = [NSPredicate predicateWithFormat:@"NOT (syncStatus MATCHES %@)", PLSyncStatusUpToDate];
fetchRequest.predicate = needsUploadPredicate;
PLFetchedObjectsController* controller = [[PLFetchedObjectsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext];
controller.delegate = self;
[controller loadObjects];
self.fetchedObjectsController = controller;
}
就这样!代理随后会收到以下自描述的方法的通知(在主队列上)
-(void)controllerWillUpdateObjects:(PLFetchedObjectsController*)controller;
-(void)controller:(PLFetchedObjectsController *)controller didDetectAdditions:(NSSet *)addedObjects;
-(void)controller:(PLFetchedObjectsController *)controller didDetectDeletions:(NSSet *)deletedObjects;
-(void)controller:(PLFetchedObjectsController *)controller didDetectUpdates:(NSSet *)updatedObjects;
-(void)controllerDidUpdateObjects:(PLFetchedObjectsController *)controller;
在调用 loadObjects
之后,PLFetchedObjectsController
开始监听 NSManagedObjectContextDidSaveNotification
以跟踪更改。您可以使用 savedContextPredicate
属性来更多控制哪些管理对象环境的变化被处理。此属性的默认值是以下内容
[NSPredicate predicateWithBlock:^BOOL(NSManagedObjectContext* savedContext, NSDictionary *bindings) {
return ([savedContext persistentStoreCoordinator] == [self.managedObjectContext persistentStoreCoordinator] &&
[savedContext parentContext] == nil);
}];
换句话说,只有当保存上下文直接将数据保存到与初始化控制器时所用的上下文相同的持久存储协调器中时,才会处理对象的变化。
如上所述,PLFetchedObjectsController
监听 NSManagedObjectContextDidSaveNotification
。每当上下文保存时,控制器会存储新增、删除或更新的对象的 NSManagedObjectID
,然后异步(以防止保存操作时的死锁)加载这些对象,并将它们与其已经拥有的对象进行比较,以此来跟踪必须通知其代理的增加、更改或删除。
PLFetchedObjectsController
可在 MIT 许可证下使用。请参阅 LICENSE 获取更多信息。