gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:18:16 25 4
gpt4 key购买 nike

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

我有一个管理一堆 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com