cocoa - 组获取/数据更新(类结构设计)

标签 cocoa swift design-patterns core-data nsarraycontroller

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

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

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

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

它有点类似于 NSArrayController,但我的类在后端执行更多功能,而 NSArrayController 更多的是用于将 View 绑定(bind)到后端。

最佳答案

您应该查找 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;
}

这样做,您将免费获得

  • 所有核心数据处理,包括优化获取次数(您可以期望/希望 NSArrayController 得到很好的优化,并且在不需要时不会重新排列对象)
  • 除了核心数据之外,还可以绑定(bind)到 NSArray 或 NSSet 等模型源(可以是另一个 NSArrayController 的排列对象)
  • 可以将 NSTableView 绑定(bind)到您的 Controller
  • 所有 NSArrayController 功能,例如谓词过滤

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

关于cocoa - 组获取/数据更新(类结构设计),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28931684/

相关文章:

javascript - 用于并行加载依赖数据源的 Coffeescript/Javascript 设计模式

objective-c - iOS Blocks - 定义类似 UIView 动画的 block

objective-c - NSCoder 二进制文件格式应应用什么文件扩展名?

objective-c - 具有多行的 NSTextFieldCell

objective-c - 将 std::map 转换为 Objective-C NSMutableArray 元素

ios - SVProgressHUD 在显示 UITableView 之前不显示

java - 如何设计可扩展的错误码?

design-patterns - 具有非同事类的调解器模式

ios - 使用 UpdateChildValues 从 Firebase 中删除

ios - 使用 Firebase 的最新版本 Xcode 出现错误?