当我在后台下载内容的NSOperation
被解除分配时,我遇到了CoreData问题。
我正在使用嵌套的托管对象上下文,操作使用的上下文在-[NSManagedObjectContext performBlock:]
中保护了所有内容
然而,在操作被解除分配的时候,我得到了以下堆栈的崩溃:
#0 0x022d9098 in objc_msgSend ()
#1 0x00bfb903 in _PFObjectIDFastHash64 ()
#2 0x029fbdb0 in __CFDictionaryHashKey ()
#3 0x029e13e2 in CFBasicHashFindBucket ()
#4 0x029e0e2d in CFDictionaryGetValue ()
#5 0x00c0a408 in -[NSPersistentStoreCache incrementRefCountForObjectID:] ()
#6 0x00c0a37e in -[NSSQLCore managedObjectContextDidRegisterObjectsWithIDs:] ()
#7 0x00cd378c in -[NSPersistentStoreCoordinator(_NSInternalMethods) _informAffectedStoresOfInterestByChildContextInObjectsWithObjectIDs:withSelector:] ()
#8 0x00c0a29f in -[NSPersistentStoreCoordinator(_NSInternalMethods) managedObjectContextDidRegisterObjectsWithIDs:] ()
#9 0x00cb41db in __95-[NSManagedObjectContext(_NestedContextSupport) managedObjectContextDidRegisterObjectsWithIDs:]_block_invoke_0 ()
#10 0x00c39cc1 in internalBlockToNSManagedObjectContextPerform ()
#11 0x025af014 in _dispatch_client_callout ()
#12 0x0259ed5f in _dispatch_barrier_sync_f_invoke ()
#13 0x0259eaa3 in dispatch_barrier_sync_f ()
#14 0x00c39c8b in _perform ()
#15 0x00c3a6e9 in -[NSManagedObjectContext(_NestedContextSupport) managedObjectContextDidRegisterObjectsWithIDs:] ()
#16 0x00cb41db in __95-[NSManagedObjectContext(_NestedContextSupport) managedObjectContextDidRegisterObjectsWithIDs:]_block_invoke_0 ()
#17 0x00c39cc1 in internalBlockToNSManagedObjectContextPerform ()
#18 0x025a0731 in _dispatch_barrier_sync_f_slow_invoke ()
#19 0x025af014 in _dispatch_client_callout ()
#20 0x0259f7d5 in _dispatch_main_queue_callback_4CF ()
#21 0x02a12af5 in __CFRunLoopRun ()
#22 0x02a11f44 in CFRunLoopRunSpecific ()
#23 0x02a11e1b in CFRunLoopRunInMode ()
#24 0x02dff7e3 in GSEventRunModal ()
#25 0x02dff668 in GSEventRun ()
#26 0x0120bffc in UIApplicationMain ()
#27 0x0000285d in main at /Users/mochs/Projects/12_IP_Lufthansa_Next/Lufthansa/Supporting Files/main.m:16
#28 0x00002785 in start ()
我真的不知道发生了什么事。我所知道的是:
[context reset]
修复了我们之前的几个问题。此时并发类型为NSConfinementConcurrencyType
,我没有使用performBlock:
NSPrivateQueueConcurrencyType
并使其使用performBlock:
,现在错误又回来了。我很确定对reset
的调用并没有真正解决问题,而只是修复崩溃。我不知道究竟是什么导致了这种崩溃。
有人知道这个错误是什么吗?
祝你好运, 迈克尔
答案 0 :(得分:0)
据我所知,Core Data不是线程安全的。在github上,你可以找到这些扩展,使Core Data线程安全Adam Roth
答案 1 :(得分:0)
最后我发现了这个问题。将所有上下文保存到持久性存储时,使用我在saveToPersistentStore:
中使用的方法RestKit
,并进行一些小的更改以符合我们的要求。
以下一行应该可以作为iOS5的修复工具,至少在iOS6上引起了这个问题:
[contextToSave obtainPermanentIDsForObjects:[[contextToSave insertedObjects] allObjects] error:&localError];
我必须进一步调查这个问题只发生在iOS6上(正确的知道,我们没有针对其他目标)在我向他们发送问题请求之前,但只是删除这一行就解决了这个问题。