我创建了一个程序,我有时会将一些锚点移动到另一个
当我移动那些锚时,我会重新计算2个锚点附近的商业距离(锚点之前和之后)。计算在后台完成
我使用此标准代码更新内容
+(void)commit {
// get the moc for this thread
[Tools breakIfLock];
NSManagedObjectContext *moc = [self managedObjectContext];
NSThread *thread = [NSThread currentThread];
DLog(@"threadKey commit%@" , [[self class]threadKey]);
if ([thread isMainThread] == NO) {
// only observe notifications other than the main thread
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSave:) name:NSManagedObjectContextDidSaveNotification object:moc];
}
NSError *error;
if (![moc save:&error]) {
CLog(@"Error in Saving %@", error);
DLog(@"What the hell error is it");
}
else{
}
if ([thread isMainThread] == NO) {
[[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextDidSaveNotification object:moc];
}
//[GrabClass StopNetworkActivityIndicatorVisible];
}
+(void)contextDidSave:(NSNotification*)saveNotification {
dispatch_async(dispatch_get_main_queue(), ^{
BadgerNewAppDelegate *delegate = [BNUtilitiesQuick appDelegate];
DLog (@"currentThreadinContextDidSave: %@",[self threadKey]);
NSManagedObjectContext *moc = delegate.managedObjectContext; //delegate for main object
CLog(@"saveNotification : %@",saveNotification);
[moc mergeChangesFromContextDidSaveNotification:saveNotification];
});
//[moc performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) withObject:saveNotification waitUntilDone:YES];
}
我突破并看到距离确实得到了更新。一切都很好
但NSFetchedResultsController
fetchedObjects似乎没有更新,仍然使用旧值。
怎么可能?
还
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
DLog(@"controllerWillChangeContent: %@", controller);
[self.tableViewA beginUpdates];
}
即使NSManagedObjectContext
发生了变化,也永远不会调用。
实际上,我不确定managedObjectContext
是否已经改变。我怎么知道?我的意思是将更改managedObjectContext以确保fetchController.fetchedObjects
中的更改。
据我所知,没有缓存。我怎么能确定呢?
答案 0 :(得分:4)
fetchedObjects
属性状态的The NSFetchedResultsController文档:
结果数组仅包含由指定的实体的实例 获取请求(fetchRequest)并匹配其谓词。 (如果 获取请求没有谓词,那么结果数组包含所有 获取请求指定的实体的实例。)
结果数组反映了托管对象的内存状态 控制器的托管对象上下文,而不是它们的状态 持久存储。 但是,返回的数组不会更新为 管理对象将被插入,修改或删除。
可用性适用于iOS 3.0及更高版本。
我不能说适当的解决方法是什么。我的第一个想法是在委托实现中调用performFetch:
中的controllerDidChangeContent:
。
fetchedObjects
数组似乎只是通过使用空实现覆盖controllerDidChangeContent:
来更新。这是使用适用于iOS 5.1的iPad和iPad模拟器的情况。
文档和我观察到的内容之间显然存在一些差异。我没有解释。抱歉。我只能建议您在controllerDidChangeContent:
中执行抓取只是为了安全起见。