组获取/数据更新(class结构设计)

group fetch / data updates (class structure design)

以下场景的最佳设计是什么?

我有一个 class 管理着一堆 NSManagedObjects。插入、删除、获取等。viewController 使用此对象作为 tableView 的数据源。因此,每次托管对象发生变化(添加、删除或更改)时,tableview 都必须重新加载数据()。

为确保我的 class 具有正确的对象列表,它应该在每次删除或插入后获取()managedObjects 并通知任何观察者其内容已更改。

到目前为止,这一切都运行良好。但是我会限制 fetch() 操作的数量。就像 NSView 只绘制一次,即使你多次调用 setNeedsDisplay。执行类似操作的最佳方法是什么?

它有点类似于 NSArrayController,但我的 class 在后端执行更多功能,而 NSArrayController 更多用于将视图绑定到后端。

您应该寻找 NSManagedObjectContextObjectsDidChangeNotification,由 NSManagedObjectContext

发布

The notification is posted during processPendingChanges, after the changes have been processed, but before it is safe to call save: again (if you try, you will generate an infinite loop).

The notification object is the managed object context. The userInfo dictionary contains the following keys: NSInsertedObjectsKey, NSUpdatedObjectsKey, and NSDeletedObjectsKey.

核心数据为您合并更改,因此它已经非常优化。

无论如何,根据你想做什么,更好的选择可能是子类化 NSArrayController,可能会覆盖 - (NSArray *)arrangeObjects:(NSArray *)objects 方法,例如:

- (NSArray *)arrangeObjects:(NSArray *)objects
{
    NSArray *a1 = [self mayBeYouWantToPreprocessFetchedObjects:objects];
    NSArray *a2 = [super arrangeObjects:a1]; // this performs filtering, etc
    NSArray *a3 = [self mayBeYouWantToPostProcessArrangedObjects:a2];
    // [self doWhatYouWantWithArrangedObjects:a3]; // e.g. trigger a reloadData if you're not using bindings
    // or probably better : performOnMainThread: a method that will use arrangedObjects :
    [self performSelectorOnMainThread:@selector(dataWasReloaded) withObject:nil waitUntilDone:NO];

    return a3;
}

这样做,您将免费获得

  • 所有核心数据处理,包括优化获取次数(你可以expect/hope NSArrayController 优化得很好,不需要时不会重新排列对象)
  • 除了核心数据(可以是 f.i。另一个 NSArrayController 的 arrangedObjects)之外,还可以绑定到 NSArray 或 NSSet 等模型源
  • 可以将 NSTableView 绑定到您的控制器
  • 所有 NSArrayController 功能,例如谓词过滤

我正在使用这种技术为 NSOutlineView 提供数据源(部分原因是我对获取的对象进行了一些特定处理,还因为 NSTreeController 非常有限),仍然能够绑定 NSTableView 并拥有我的数据的平面视图