Leo*_*rdo 1 core-data objective-c nsfetchedresultscontroller
我有一个NSManagedObject实体,它覆盖validateForInsert和validateForUpdate.
根据我写的一些逻辑,当对象一致性出错时,此方法会正确返回NO.
该应用程序是一个经典的uitableview,由NSFetchedResultsController支持,带有详细视图控制器.
当我添加一个新实体时,详细视图控制器将使用nil objectID进行实例化,并被推送到导航堆栈中.当我弹出详细控制器时,调用[context save:&error],并且通过放置一些断点,我发现当我添加一个新实体时,即使validateForInsert返回NO,并且includePendingChanges设置为不是.
当我再次重新弹出详细控制器时,当然也会再次调用save,也就是validate方法,但这次NSFetchedResultsControllerDelegate不会被触发.
我想知道这是否是正常行为,或者我是否遗漏了模型中的某些内容.
[UPDATE]
这是委托方法中断点之后的堆栈跟踪:
#0 0x0003e5ba in -[MyTableViewController controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:] at ......
#1 0x011512f9 in -[NSFetchedResultsController(PrivateMethods) _managedObjectContextDidChange:] ()
#2 0x00b46a29 in __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke_0 ()
#3 0x01759855 in ___CFXNotificationPost_block_invoke_0 ()
#4 0x01759778 in _CFXNotificationPost ()
#5 0x00a8b19a in -[NSNotificationCenter postNotificationName:object:userInfo:] ()
#6 0x0106a673 in -[NSManagedObjectContext(_NSInternalNotificationHandling) _postObjectsDidChangeNotificationWithUserInfo:] ()
#7 0x01101f5e in -[NSManagedObjectContext(_NSInternalChangeProcessing) _createAndPostChangeNotification:withDeletions:withUpdates:withRefreshes:] ()
#8 0x01065ad3 in -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] ()
#9 0x0106916b in -[NSManagedObjectContext save:] ()
#10 0x00004490 in -[MyAppDelegate saveContext:]
Run Code Online (Sandbox Code Playgroud)
可以看出,即使在上下文中调用了save,也不会调用validate,因此这会使得获取的控制器委托被触发.
[更新2]
特别是,不知道它是否相关,这导致controllerDidChangeObject中的异常(并非总是):
CoreData:错误:严重的应用程序错误.在调用-controllerDidChangeContent:期间,从NSFetchedResultsController的委托中捕获到异常.无效更新:第0节中的行数无效.更新后的现有部分中包含的行数(4)必须等于更新前该部分中包含的行数(3),加上或减去数字从该部分插入或删除的行(0插入,0删除)和加或减移入或移出该部分的行数(0移入,0移出).用户信息(null)
并且在origin表中有三行,只是因为当在上下文中创建对象时上下文绕过validateFor方法似乎插入了一行,行号中存在不一致.
控制器委托非常简单和标准:
-(void)controllerWillChangeContent:(NSFetchedResultsController*)controller {
[self.tableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
// for testing purpose I am not doing any modification
return;
}
-(void)controllerDidChangeContent:(NSFetchedResultsController*)controller {
[self.tableView endUpdates];
}
Run Code Online (Sandbox Code Playgroud)
我仍然不知道谁在更新表格视图
我认为这是正常行为; 获取的结果控制器在显示更改之前不需要保存.如果您不希望在详细信息视图中进行的更改在保存之前显示在主数据库中,则必须为详细信息视图创建单独的NSManagedObject上下文.这样,只有保存到持久存储的对象才会将其返回到获取的结果控制器.