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

时间:2015-03-08 20:44:50

标签: cocoa swift design-patterns core-data nsarraycontroller

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

我有一个管理一堆NSManagedObjects的类。插入,删除,获取等.viewController使用此对象作为tableView的dataSource。因此,每次托管对象更改(添加,删除或更改)时,tableview都必须reloadData()。

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

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

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

1 个答案:

答案 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;
}

这样做,你会得到免费的

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

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