当我的其中一个NSManagedObjectContext运行其performBlock时,用户已选择退出其帐户(这将重置所有上下文并删除持久性存储)。显然,此重置代码在与performBlock相似的时间运行,因此该应用程序崩溃并发生以下异常:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Object's persistent store is not reachable from this NSManagedObjectContext's coordinator'
它崩溃的确切位置似乎是当一个上下文保存在其performBlock中时,该did save然后发出ojit_code通知,并合并到另一个上下文中。这是堆栈跟踪:

0   CoreFoundation                      0x03b96df6 __exceptionPreprocess + 182

1   libobjc.A.dylib                     0x03820a97 objc_exception_throw + 44

2   CoreData                            0x034f7791 _PFRetainedObjectIDCore + 1169

3   CoreData                            0x034f72f0 -[NSManagedObjectContext(_NSInternalAdditions) _retainedObjectWithID:] + 32

4   CoreData                            0x034db0f3 -[NSManagedObjectContext objectWithID:] + 595

5   CoreData                            0x0352e14e _faultBatchAtIndex + 1102

6   CoreData                            0x0352ed02 -[_PFBatchFaultingArray objectAtIndex:] + 50

7   CoreData                            0x035dd010 +[NSFetchedResultsController(PrivateMethods) _insertIndexForObject:inArray:lowIdx:highIdx:sortDescriptors:] + 144

8   CoreData                            0x035d7ba2 -[NSFetchedResultsController(PrivateMethods) _postprocessInsertedObjects:] + 738

9   CoreData                            0x035da3dd __77-[NSFetchedResultsController(PrivateMethods) _managedObjectContextDidChange:]_block_invoke + 2285

10  CoreData                            0x034e7454 developerSubmittedBlockToNSManagedObjectContextPerform + 196

11  CoreData                            0x034e7337 -[NSManagedObjectContext performBlockAndWait:] + 231

12  CoreData                            0x035d9acf -[NSFetchedResultsController(PrivateMethods) _managedObjectContextDidChange:] + 127

13  Foundation                          0x00eff929 __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke + 40

14  CoreFoundation                      0x03b61974 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 20

15  CoreFoundation                      0x03a4f61b _CFXNotificationPost + 3051

16  Foundation                          0x00eeef26 -[NSNotificationCenter postNotificationName:object:userInfo:] + 98

17  CoreData                            0x034c84d3 -[NSManagedObjectContext(_NSInternalNotificationHandling) _postObjectsDidChangeNotificationWithUserInfo:] + 83

18  CoreData                            0x034d9cbe -[NSManagedObjectContext _mergeChangesFromDidSaveDictionary:usingObjectIDs:] + 3934

19  CoreData                            0x034d8d40 -[NSManagedObjectContext mergeChangesFromContextDidSaveNotification:] + 496

20  App                              0x00319707 __57-[ContextManager contextDidSavePrivateQueueContext:]_block_invoke + 103

这仅是iOS 8-iOS 7正常运行。我无法确定的是这是否是我感觉到的iOS 8错误,或者Apple是否在Core Data中引入了“新功能”,这打破了我们的重置流程。谁能对此有所启发?

最佳答案

我通过在NSManagedObjectContext上添加类别并使用objc_setAssociatedObject魔术添加了标记来修复了该错误。该标志用于确定上下文是否可以安全地执行出现的任何performBlock。为此,我在名为safePerformBlock的类别上添加了另一种方法来查看标志。如果为假,我将立即退出,而不是处理传入的块。

当我在上下文上删除持久性存储时,该标志设置为不安全。然后,当用户重新登录并重新创建持久性存储时,该标志将设置为安全。

本质上,我将上下文中的此标志视为performBlocks上的取消 token 。为什么我不知道API中什么都没有。在这种情况下,这是我能找到的最佳解决方案。

关于ios - 在performBlock中重置NSManagedObjectContext时,iOS 8应用程序崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26234523/

10-14 21:33