- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了一个我无法理解的NSObjectInaccessibleException
:
*** Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault for '0x8c40040 <x-coredata://85B02C1C-1FFC-4CBF-B7AC-EEA259115427/Event/p6>''
*** First throw call stack:
(
0 CoreFoundation 0x01aa15e4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x018248b6 objc_exception_throw + 44
2 CoreData 0x0025733b _PFFaultHandlerLookupRow + 2715
3 CoreData 0x00256897 -[NSFaultHandler fulfillFault:withContext:forIndex:] + 39
4 CoreData 0x00256473 _PF_FulfillDeferredFault + 259
5 CoreData 0x002562c6 _sharedIMPL_pvfk_core + 70
6 CoreData 0x0025acd5 -[NSManagedObject(_PFDynamicAccessorsAndPropertySupport) _genericValueForKey:withIndex:flags:] + 85
7 CoreData 0x00294781 _PF_Handler_Public_GetProperty + 161
8 CoreData 0x00294685 -[NSManagedObject valueForKey:] + 149
9 Foundation 0x01471a5a -[NSObject(NSKeyValueCoding) valueForKeyPath:] + 409
10 Foundation 0x015079ba -[NSSortDescriptor compareObject:toObject:] + 166
11 CoreData 0x00366175 +[NSFetchedResultsController(PrivateMethods) _insertIndexForObject:inArray:lowIdx:highIdx:sortDescriptors:] + 309
12 CoreData 0x00360f61 -[NSFetchedResultsController(PrivateMethods) _postprocessInsertedObjects:] + 737
13 CoreData 0x00362c44 -[NSFetchedResultsController(PrivateMethods) _postprocessUpdatedObjects:] + 916
14 CoreData 0x00363578 -[NSFetchedResultsController(PrivateMethods) _managedObjectContextDidChange:] + 2152
15 Foundation 0x014f7bf9 __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke + 40
16 CoreFoundation 0x01afd524 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 20
17 CoreFoundation 0x01a5500b _CFXNotificationPost + 2859
18 Foundation 0x01431951 -[NSNotificationCenter postNotificationName:object:userInfo:] + 98
19 CoreData 0x00268173 -[NSManagedObjectContext(_NSInternalNotificationHandling) _postObjectsDidChangeNotificationWithUserInfo:] + 83
20 CoreData 0x0030778f -[NSManagedObjectContext(_NSInternalChangeProcessing) _createAndPostChangeNotification:withDeletions:withUpdates:withRefreshes:] + 367
21 CoreData 0x00263e38 -[NSManagedObjectContext(_NSInternalChangeProcessing) _postRefreshedObjectsNotificationAndClearList] + 136
22 CoreData 0x002639e4 -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] + 3140
23 CoreData 0x00262d99 -[NSManagedObjectContext processPendingChanges] + 41
24 CoreData 0x00236fe1 _performRunLoopAction + 321
25 CoreFoundation 0x01a694ce __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30
26 CoreFoundation 0x01a6941f __CFRunLoopDoObservers + 399
27 CoreFoundation 0x01a47344 __CFRunLoopRun + 1076
28 CoreFoundation 0x01a46ac3 CFRunLoopRunSpecific + 467
29 CoreFoundation 0x01a468db CFRunLoopRunInMode + 123
30 GraphicsServices 0x039029e2 GSEventRunModal + 192
31 GraphicsServices 0x03902809 GSEventRun + 104
32 UIKit 0x00592d3b UIApplicationMain + 1225
33 RefreshDeletedTest 0x00005d9d main + 141
34 libdyld.dylib 0x020df70d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type _NSCoreDataException
它是由特定的代码流程引起的:
- (void)deleteObject:(NSManagedObject *)object {
NSManagedObjectID *objID = object.objectID;
NSManagedObjectContext *dataProcessingMoc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
dataProcessingMoc.persistentStoreCoordinator = self.managedObjectContext.persistentStoreCoordinator;
dataProcessingMoc.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataProcessingContextDidSave:) name:NSManagedObjectContextDidSaveNotification object:dataProcessingMoc];
// If I use performBlockAndWait: instead of performBlock: the issue goes away.
[dataProcessingMoc performBlock:^{
NSManagedObject *objInDPMoc = [dataProcessingMoc objectWithID:objID];
NSLog(@"Delete: %@", objInDPMoc);
[dataProcessingMoc deleteObject:objInDPMoc]; // 1
[object.managedObjectContext performBlockAndWait:^{
[object.managedObjectContext refreshObject:object mergeChanges:NO]; // 2
}];
[dataProcessingMoc save:NULL]; // 3
}];
}
- (void)dataProcessingContextDidSave:(NSNotification *)note {
NSManagedObjectContext *moc = self.managedObjectContext;
[moc performBlockAndWait:^{ // 3
[moc mergeChangesFromContextDidSaveNotification:note];
NSError *error;
if ([moc hasChanges] && ![moc save:&error]) {
NSLog(@"Unresolved error %@", error);
abort();
}
}];
}
注意:代码必须看起来很奇怪并且没有多大意义。这是我将实际代码减少到最少的错误重现代码的结果。
NSManagedObjectContextDidSaveNotification
将其更改合并到主 moc。异常发生在真正的合并之前,在主 moc 的 performBlockAndWait:
调用处。
这里是崩溃时后台moc的线程栈:
#0 0x02210fb6 in semaphore_wait_trap ()
#1 0x01e3ccde in _dispatch_thread_semaphore_wait ()
#2 0x01e3a516 in _dispatch_barrier_sync_f_slow ()
#3 0x01e3a413 in dispatch_barrier_sync_f ()
#4 0x0028bf1f in -[NSManagedObjectContext performBlockAndWait:] ()
#5 0x000037b5 in -[MasterViewController dataProcessingContextDidSave:] at /Users/an0/dev/Projects/iOS/Study/RefreshDeletedTest/RefreshDeletedTest/MasterViewController.m:84
#6 0x014f7bf9 in __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke ()
#7 0x01afd524 in __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ ()
#8 0x01a5500b in _CFXNotificationPost ()
#9 0x01431951 in -[NSNotificationCenter postNotificationName:object:userInfo:] ()
#10 0x0027bb2c in -[NSManagedObjectContext(_NSInternalAdditions) _didSaveChanges] ()
#11 0x0026720f in -[NSManagedObjectContext save:] ()
#12 0x0000345a in __37-[MasterViewController cleanObjects:]_block_invoke at /Users/an0/dev/Projects/iOS/Study/RefreshDeletedTest/RefreshDeletedTest/MasterViewController.m:78
#13 0x003047c3 in developerSubmittedBlockToNSManagedObjectContextPerform_privateasync ()
#14 0x01e4d4b0 in _dispatch_client_callout ()
#15 0x01e3b07f in _dispatch_queue_drain ()
#16 0x01e3ae7a in _dispatch_queue_invoke ()
#17 0x01e3be1f in _dispatch_root_queue_drain ()
#18 0x01e3c137 in _dispatch_worker_thread2 ()
#19 0x021d9dab in _pthread_wqthread ()
为什么会这样崩溃?是我的代码真的错了还是 Core Data
的错误?
我无法理解的另一件奇怪的事情是,在这样的崩溃之后,应用程序无法再启动,因为它会在启动时崩溃:
2014-01-05 12:31:34.151 RefreshDeletedTest[3546:70b] *** Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault for '0xa88d060 <x-coredata://93009ECF-EC6E-4B12-BC40-997C4BF3B8DF/Event/p11>''
*** First throw call stack:
(
0 CoreFoundation 0x01aa05e4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x018238b6 objc_exception_throw + 44
2 CoreData 0x0025633b _PFFaultHandlerLookupRow + 2715
3 CoreData 0x00255897 -[NSFaultHandler fulfillFault:withContext:forIndex:] + 39
4 CoreData 0x00255473 _PF_FulfillDeferredFault + 259
5 CoreData 0x002552c6 _sharedIMPL_pvfk_core + 70
6 CoreData 0x00259cd5 -[NSManagedObject(_PFDynamicAccessorsAndPropertySupport) _genericValueForKey:withIndex:flags:] + 85
7 CoreData 0x00293781 _PF_Handler_Public_GetProperty + 161
8 CoreData 0x00293685 -[NSManagedObject valueForKey:] + 149
9 Foundation 0x014a8f0a -[NSArray(NSKeyValueCoding) valueForKey:] + 456
10 Foundation 0x01470a5a -[NSObject(NSKeyValueCoding) valueForKeyPath:] + 409
11 Foundation 0x0149b99d -[NSArray(NSKeyValueCoding) valueForKeyPath:] + 580
12 CoreData 0x0035b7e9 -[NSFetchedResultsController performFetch:] + 697
13 RefreshDeletedTest 0x00003910 -[MasterViewController fetchedResultsController] + 800
14 RefreshDeletedTest 0x0000307e -[MasterViewController numberOfSectionsInTableView:] + 78
15 UIKit 0x007e5b94 -[UITableViewRowData(UITableViewRowDataPrivate) _updateNumSections] + 102
16 UIKit 0x007e6993 -[UITableViewRowData invalidateAllSections] + 69
17 UIKit 0x0065d237 -[UITableView _updateRowData] + 194
18 UIKit 0x0065d170 -[UITableView _ensureRowDataIsLoaded] + 45
19 UIKit 0x006704b3 -[UITableView numberOfSections] + 35
20 UIKit 0x0084d3d3 -[UITableViewController viewWillAppear:] + 103
21 UIKit 0x006a8bfa -[UIViewController _setViewAppearState:isAnimating:] + 419
22 UIKit 0x006a9108 -[UIViewController __viewWillAppear:] + 114
23 UIKit 0x006cb3f5 -[UINavigationController _startTransition:fromViewController:toViewController:] + 800
24 UIKit 0x006cc09c -[UINavigationController _startDeferredTransitionIfNeeded:] + 645
25 UIKit 0x006cccb9 -[UINavigationController __viewWillLayoutSubviews] + 57
26 UIKit 0x00806181 -[UILayoutContainerView layoutSubviews] + 213
27 UIKit 0x0e35656f -[UILayoutContainerViewAccessibility(SafeCategory) layoutSubviews] + 50
28 UIKit 0x005fc267 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 355
29 libobjc.A.dylib 0x0183581f -[NSObject performSelector:withObject:] + 70
30 QuartzCore 0x045802ea -[CALayer layoutSublayers] + 148
31 QuartzCore 0x045740d4 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
32 QuartzCore 0x04580235 -[CALayer layoutIfNeeded] + 160
33 UIKit 0x006b7613 -[UIViewController window:setupWithInterfaceOrientation:] + 304
34 UIKit 0x005d6177 -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:isRotating:] + 5212
35 UIKit 0x005d4d16 -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:] + 82
36 UIKit 0x005d4be8 -[UIWindow _setRotatableViewOrientation:updateStatusBar:duration:force:] + 117
37 UIKit 0x005d4c70 -[UIWindow _setRotatableViewOrientation:duration:force:] + 67
38 UIKit 0x005d3d0a __57-[UIWindow _updateToInterfaceOrientation:duration:force:]_block_invoke + 120
39 UIKit 0x005d3c6c -[UIWindow _updateToInterfaceOrientation:duration:force:] + 400
40 UIKit 0x005d49c3 -[UIWindow setAutorotates:forceUpdateInterfaceOrientation:] + 870
41 UIKit 0x005d7fb6 -[UIWindow setDelegate:] + 449
42 UIKit 0x006a9737 -[UIViewController _tryBecomeRootViewControllerInWindow:] + 180
43 UIKit 0x005cdc1c -[UIWindow addRootViewControllerViewIfPossible] + 609
44 UIKit 0x005cdd97 -[UIWindow _setHidden:forced:] + 312
45 UIKit 0x005ce02d -[UIWindow _orderFrontWithoutMakingKey] + 49
46 UIKit 0x0e332c66 -[UIWindowAccessibility(SafeCategory) _orderFrontWithoutMakingKey] + 77
47 UIKit 0x005d889a -[UIWindow makeKeyAndVisible] + 65
48 UIKit 0x0058bcd0 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1851
49 UIKit 0x005903a8 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 824
50 UIKit 0x005a487c -[UIApplication handleEvent:withNewEvent:] + 3447
51 UIKit 0x005a4de9 -[UIApplication sendEvent:] + 85
52 UIKit 0x00592025 _UIApplicationHandleEvent + 736
53 GraphicsServices 0x039032f6 _PurpleEventCallback + 776
54 GraphicsServices 0x03902e01 PurpleEventCallback + 46
55 CoreFoundation 0x01a1bd65 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
56 CoreFoundation 0x01a1ba9b __CFRunLoopDoSource1 + 523
57 CoreFoundation 0x01a4677c __CFRunLoopRun + 2156
58 CoreFoundation 0x01a45ac3 CFRunLoopRunSpecific + 467
59 CoreFoundation 0x01a458db CFRunLoopRunInMode + 123
60 UIKit 0x0058fadd -[UIApplication _run] + 840
61 UIKit 0x00591d3b UIApplicationMain + 1225
62 RefreshDeletedTest 0x0000508d main + 141
63 libdyld.dylib 0x020de70d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type _NSCoreDataException
这是您可以自己运行以查看问题的示例项目:http://d.pr/f/y3VQ
最佳答案
在多线程环境中,无法避免此问题。
只要您在同一层次结构级别上有 2 个不同的上下文(无论是父子架构还是直接连接到商店),您可能会遇到这样的情况,其中一个上下文删除了一个对象(并提交了对商店的更改)并且另一个尝试在合并更改之前访问此对象。
当父上下文提交对存储的更改并且其子项尝试访问他持有的已删除项目时,也可能会发生这种情况。
通常,在提交之前未在上下文之间自动传播更改的每个地方,都有机会获得此异常。
如果您可以管道化上下文 (store-context1-context2-...) 并且只从链中的最终上下文中删除,则可以避免此问题。
您可以设计一些算法来延迟您的删除操作,以便仅当没有其他上下文使用特定项目时才提交它们,但这涉及到您的大量簿记工作。
您可以通过获取完整的(无故障)对象或您将要处理的整个子图(使用 FRC 时无法完成)并对这些对象进行操作来减少上下文之间的冲突。
关于ios - 在后台 moc 中删除对象然后在主 moc 中刷新它会导致 NSFetchedResultsController 更新崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20937496/
尝试使用集成到 QTCreator 的表单编辑器,但即使我将插件放入 QtCreator.app/Contents/MacOS/designer 也不会显示。不过,相同的 dylib 文件确实适用于独
在此代码示例中。 “this.method2();”之后会读到什么?在返回returnedValue之前会跳转到method2()吗? public int method1(int returnedV
我的项目有通过gradle配置的依赖项。我想添加以下依赖项: compile group: 'org.restlet.jse', name: 'org.restlet.ext.apispark', v
我将把我们基于 Windows 的客户管理软件移植到基于 Web 的软件。我发现 polymer 可能是一种选择。 但是,对于我们的使用,我们找不到 polymer 组件具有表格 View 、下拉菜单
我的项目文件夹 Project 中有一个文件夹,比如 ED 文件夹,当我在 Eclipse 中指定在哪里查找我写入的文件时 File file = new File("ED/text.txt"); e
这是奇怪的事情,这个有效: $('#box').css({"backgroundPosition": "0px 250px"}); 但这不起作用,它只是不改变位置: $('#box').animate
这个问题在这里已经有了答案: Why does OR 0 round numbers in Javascript? (3 个答案) 关闭 5 年前。 Mozilla JavaScript Guide
这个问题在这里已经有了答案: Is the function strcmpi in the C standard libary of ISO? (3 个答案) 关闭 8 年前。 我有一个问题,为什么
我目前使用的是共享主机方案,我不确定它使用的是哪个版本的 MySQL,但它似乎不支持 DATETIMEOFFSET 类型。 是否存在支持 DATETIMEOFFSET 的 MySQL 版本?或者有计划
研究 Seam 3,我发现 Seam Solder 允许将 @Named 注释应用于包 - 在这种情况下,该包中的所有 bean 都将自动命名,就好像它们符合条件一样@Named 他们自己。我没有看到
我知道 .append 偶尔会增加数组的容量并形成数组的新副本,但 .removeLast 会逆转这种情况并减少容量通过复制到一个新的更小的数组来改变数组? 最佳答案 否(或者至少如果是,则它是一个错
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
noexcept 函数说明符是否旨在 boost 性能,因为生成的对象中可能没有记录异常的代码,因此应尽可能将其添加到函数声明和定义中?我首先想到了可调用对象的包装器,其中 noexcept 可能会产
我正在使用 Angularjs 1.3.7,刚刚发现 Promise.all 在成功响应后不会更新 angularjs View ,而 $q.all 会。由于 Promises 包含在 native
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我正在编写一个玩具(物理)矢量库,并且遇到了 GHC 坚持认为函数应该具有 Integer 的问题。是他们的类型。我希望向量乘以向量以及标量(仅使用 * ),虽然这可以通过仅使用 Vector 来实现
PHP 的 mail() 函数发送邮件正常,但 Swiftmailer 的 Swift_MailTransport 不起作用! 这有效: mail('user@example.com', 'test
我尝试通过 php 脚本转储我的数据,但没有命令行。所以我用 this script 创建了我的 .sql 文件然后我尝试使用我的脚本: $link = mysql_connect($host, $u
使用 python 2.6.4 中的 sqlite3 标准库,以下查询在 sqlite3 命令行上运行良好: select segmentid, node_t, start, number,title
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我是一名优秀的程序员,十分优秀!