以下场景的最佳设计是什么?
我有一个管理一堆 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/