以下情景的最佳设计是什么?
我有一个管理一堆NSManagedObjects的类。插入,删除,获取等.viewController使用此对象作为tableView的dataSource。因此,每次托管对象更改(添加,删除或更改)时,tableview都必须reloadData()。
为了确保我的类具有正确的对象列表,它应该在每次删除或插入后获取()托管对象,并通知任何观察者其内容已更改。
到目前为止,这一切都很顺利。但是我会限制fetch()操作的数量。就像NSView只绘制一次,即使您多次调用setNeedsDisplay。做类似的事情的最佳方法是什么?
它类似于NSArrayController,但我的类在后端执行更多功能,而NSArrayController更多用于将视图绑定到后端。
答案 0 :(得分:1)
您应该查找由NSManagedObjectContext发布的NSManagedObjectContextObjectsDidChangeNotification
在处理更改之后,在processPendingChanges期间发布通知,但在安全地调用save之前:再次(如果您尝试,将生成无限循环)。
通知对象是托管对象上下文。 userInfo字典包含以下键:NSInsertedObjectsKey,NSUpdatedObjectsKey和NSDeletedObjectsKey。
核心数据为您合并更改,因此已经进行了相当优化。
无论如何,根据你想要做的事情,一个更好的选择可能是子类NSArrayController,可能会覆盖 - (NSArray *)arrangeObjects:(NSArray *)对象方法,例如:
- (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;
}
这样做,你会得到免费的
我正在使用这种技术为NSOutlineView提供数据源(部分原因是因为我对获取的对象进行了一些特定处理,并且因为NSTreeController非常有限),仍然能够绑定NSTableView并具有平面视图我的数据