我遇到CoreData问题并完成了托管对象。
堆栈追踪:
Uncaught exception: CoreData could not fulfill a fault for '0x11cec410 <x-coredata://08BF0B39-BA5D-404E-B75E-FD4FA906DE3E/TaskDescription/p1747>'. Stack trace: (
"4 libc++abi.dylib 0x03553f60 _ZSt11__terminatePFvvE + 14",
"5 libc++abi.dylib 0x03553b97 __cxa_rethrow + 103",
"6 libobjc.A.dylib 0x02cb0a57 objc_exception_rethrow + 47",
"7 CoreFoundation 0x02f95bc5 CFRunLoopRunSpecific + 613",
"8 CoreFoundation 0x02f9594b CFRunLoopRunInMode + 123"
)
*** Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault for '0x11cec410 <x-coredata://08BF0B39-BA5D-404E-B75E-FD4FA906DE3E/TaskDescription/p1747>''
*** First throw call stack:
(
0 CoreFoundation 0x02ff05e4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x02cb08b6 objc_exception_throw + 44
2 CoreData 0x0298666b _PFFaultHandlerLookupRow + 2715
3 CoreData 0x02985bc7 -[NSFaultHandler fulfillFault:withContext:forIndex:] + 39
4 CoreData 0x029857a3 _PF_FulfillDeferredFault + 259
5 CoreData 0x029855f6 _sharedIMPL_pvfk_core + 70
6 CoreData 0x0298a005 -[NSManagedObject(_PFDynamicAccessorsAndPropertySupport) _genericValueForKey:withIndex:flags:] + 85
7 CoreData 0x029c3ab1 _PF_Handler_Public_GetProperty + 161
8 CoreData 0x029c39b5 -[NSManagedObject valueForKey:] + 149
9 Foundation 0x0254e065 -[NSFunctionExpression expressionValueWithObject:context:] + 1260
10 Foundation 0x025d4109 -[NSComparisonPredicate evaluateWithObject:substitutionVariables:] + 248
11 Foundation 0x025d4009 -[NSPredicate evaluateWithObject:] + 48
12 CoreData 0x02a8f991 -[NSFetchedResultsController(PrivateMethods) _objectInResults:] + 113
13 CoreData 0x02a912c2 -[NSFetchedResultsController(PrivateMethods) _preprocessUpdatedObjects:insertsInfo:deletesInfo:updatesInfo:sectionsWithDeletes:newSectionNames:treatAsRefreshes:] + 642
14 CoreData 0x02a926f4 -[NSFetchedResultsController(PrivateMethods) _managedObjectContextDidChange:] + 1892
15 Foundation 0x02622e39 __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke + 40
16 CoreFoundation 0x0304c524 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 20
17 CoreFoundation 0x02fa407b _CFXNotificationPost + 2859
18 Foundation 0x0255cb91 -[NSNotificationCenter postNotificationName:object:userInfo:] + 98
19 CoreData 0x029974a3 -[NSManagedObjectContext(_NSInternalNotificationHandling) _postObjectsDidChangeNotificationWithUserInfo:] + 83
20 CoreData 0x02a36abf -[NSManagedObjectContext(_NSInternalChangeProcessing) _createAndPostChangeNotification:withDeletions:withUpdates:withRefreshes:] + 367
21 CoreData 0x02993168 -[NSManagedObjectContext(_NSInternalChangeProcessing) _postRefreshedObjectsNotificationAndClearList] + 136
22 CoreData 0x02992d14 -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] + 3140
23 CoreData 0x029920c9 -[NSManagedObjectContext processPendingChanges] + 41
24 CoreData 0x02966311 _performRunLoopAction + 321
25 CoreFoundation 0x02fb853e __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30
26 CoreFoundation 0x02fb848f __CFRunLoopDoObservers + 399
27 CoreFoundation 0x02f963b4 __CFRunLoopRun + 1076
28 CoreFoundation 0x02f95b33 CFRunLoopRunSpecific + 467
29 CoreFoundation 0x02f9594b CFRunLoopRunInMode + 123
30 GraphicsServices 0x0488d9d7 GSEventRunModal + 192
31 GraphicsServices 0x0488d7fe GSEventRun + 104
32 UIKit 0x016c294b UIApplicationMain + 1225
33 MYAPP 0x0003bb9d main + 141
34 MYAPP 0x00003055 start + 53
)
libc++abi.dylib: terminating with uncaught exception of type _NSCoreDataException
我只能在显示一些内部CoreData / Foundation指令的情况下看到应用程序崩溃时的所有内容。任何人都可以解释我,这是怎么回事
NSFetchedResultsController(PrivateMethods)
或
NSManagedObjectContext(_NSInternalChangeProcessing)
对我来说这看起来很奇怪。我怎样才能防止出现这样的NSObjectInaccessibleException? 我知道这个错误是由于先前删除的对象造成的。我有许多背景上下文异步运行,但我认为我遵守Apple文档中关于CoreData并发性的规则。它有时只会崩溃,从这一点上我看不到任何东西。有人有类似的情况吗?
答案 0 :(得分:2)
这与你提到的方法无关
您也无法在多上下文环境中避免此问题,在该环境中,您有多个具有相同父级的子上下文(包括nil父级)。
这可能发生在多上下文环境(或一些独特的情况)中,其中一个上下文为某个对象(他认为存在)存在错误,但同时另一个上下文从存储中删除该对象而不通知删除的另一个上下文(在上下文中持有故障试图实现它。
在多上下文环境中使用FRC,它不使用父级子系统架构,其中FRC上下文是所有子上下文的父级,将始终容易受到此异常的影响。
有关更多用例,请参阅HERE。
一种可能的解决方案是延迟实际删除FRC跟踪对象:
首先将它们标记为删除(您的FRC谓词应考虑此新属性)
然后使用后台操作删除标记为删除的对象(每个给定的时间间隔)
部分解决方案是使用父子上下文架构,通过FRC观察的上下文汇集所有事件。
这是一个部分解决方案,因为这会将问题从一个级别移到不知道彼此删除的子上下文(如果子上下文从不并行处理相同的对象,那么您可以避免这个问题)。