PLFetchedObjectsController 1.1.0

PLFetchedObjectsController 1.1.0

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

Hirad Motamed 维护。



介绍

PLFetchedObjectsController 对需要类似 NSFetchedResultsController 但更接近底层功能的场景非常有用。它与 UITableView 的绑定不是很紧密,其代理通知也不提及 NSIndexPath。它只提供您的对象,并允许您使用这些对象做任何事情(也许您想在表格视图中使用对象,而 NSFetchedResultsController 不支持这种方式)。它部分受到 Marcus Zarra 的 ZSContextWatcher 的启发。

安装

使用

基本用法

使用获取对象控制器类似于使用 NSFetchedResultsController。步骤如下:

  1. 创建一个获取请求。
  2. 初始化 PLFetchedObjectsController
  3. 实现代理方法并分配代理。
  4. 调用 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 获取更多信息。