【发布时间】:2015-02-26 18:35:03
【问题描述】:
我尝试的第一件事是使用 FetchedResultsController 来解决我的问题。这是 FRC 的一种非典型用法,因为我没有更新 TableView,我只是用它来确定实体是否正在更改,以便我知道何时保存到服务器:
self.fetchedResultsController = [Document MR_fetchAllSortedBy:@"timestamp"
ascending:NO
withPredicate:[NSPredicate predicateWithFormat:@"report.remoteId != nil && dirty == YES"]
groupBy:nil
delegate:self
inContext:_managedObjectContext];
这里的问题是,当关系实体发生变化时,FRC 不会收到更新。 IE 如果 report.remoteId 从 nil 变为 non-nil,我将看不到更新,因为 FRC 仅侦听 Document 实体上的更改。此处列出的限制:http://www.mlsite.net/blog/?p=825 和此处Changing a managed object property doesn't trigger NSFetchedResultsController to update the table view
不确定我是否真的想要实施该解决方法,因为我觉得我正在使用 FRC 来完成它不应该做的事情。我不认为苹果会解决这个限制,所以我真的不想把一个圆钉砸进一个方孔来解决我的问题。
几个选项
保存实体后,在代码中触发通知,然后在其他地方收听。我唯一不喜欢的一点是程序员必须这样做并保持最新状态,即如果有人出现并将实体保存在另一个地方,他们必须记住触发通知。
或
监听保存到默认 MOC。这是我真正想做的。像这样的:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleDataModelChange:)
name:NSManagedObjectContextObjectsDidChangeNotification
object:[NSManagedObjectContext MR_defaultContext]];
- (void)handleDataModelChange:(NSNotification *)note {
NSSet *updatedObjects = [[note userInfo] objectForKey:NSUpdatedObjectsKey];
NSSet *deletedObjects = [[note userInfo] objectForKey:NSDeletedObjectsKey];
NSSet *insertedObjects = [[note userInfo] objectForKey:NSInsertedObjectsKey];
// Do something in response to this
}
这是我的困境。这将监听默认 MOC 上的所有更改。我真的只关心对几个实体的更改。所以是的,我可以在每次通话中过滤掉我关心的实体。但是,我有一个案例,其中我保存了大量我不关心的其他实体。这意味着 NSManagedObjectContextObjectsDidChangeNotification 会触发很多,而且大多数时候我不在乎。我不想通过不断收到此通知并花时间过滤掉所有我不关心的实体来减慢我的应用程序。
有没有办法监听特定的实体保存?在 CoreData 还是 MagicalRecord 中?
如果答案是否定的,是否有更好的替代方法来监听特定实体(及其关系)的变化?
【问题讨论】:
标签: ios objective-c core-data magicalrecord