2

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 ()

我真的不知道发生了什么。我所知道的是:

  • 我正在使用 ARC
  • 我正在使用嵌套的托管对象上下文
  • 该操作使用自己的 runloop 在共享的 NSThread 中调度和执行内容
  • 线程是共享的,在释放操作时不释放
  • 在 -[NSOperation dealloc] 之后不久,应用程序在主线程中崩溃
  • 我之前[context reset]在 NSOperation 的 dealloc 方法中解决了我们几个相同的问题。这时候并发类型是NSConfinementConcurrencyType,我没用performBlock:
    • 由于一些更改,我需要将上下文的并发类型更改为NSPrivateQueueConcurrencyType并使其使用performBlock:,现在错误又回来了。

我很确定调用 toreset并没有真正解决问题,而只是修复了崩溃。我不知道是什么真正导致了这样的崩溃。

有谁知道这个错误是关于什么的?

最好的问候,迈克尔

4

2 回答 2

0

据我所知,Core Data 不是线程安全的。在 github 上,您可以找到这些使 Core Data 线程安全的扩展Adam Roth

于 2013-07-29T08:12:00.493 回答
0

最后我发现了问题。将所有上下文保存到持久存储时,使用了saveToPersistentStore:我使用的方法 from RestKit,并进行了一些小的更改以符合我们的要求。

以下行应该作为 iOS5 上的修复程序,导致了这个问题,至少在 iOS6 上:

[contextToSave obtainPermanentIDsForObjects:[[contextToSave insertedObjects] allObjects] error:&localError];

在我向他们发送问题请求之前,我必须进一步调查该问题是否仅发生在 iOS6 上(没错,我们不是针对其他东西),但只需删除此行即可解决问题。

于 2013-07-29T09:45:27.833 回答