objective-c - 使用 coredata 和多线程枚举时集合发生了变化

标签 objective-c ios multithreading ipad core-data

我正在尝试调试一个我刚刚从其他开发人员那里继承的 ipad 应用程序。目前我遇到了一个非常奇怪的错误,我不知道如何攻击。

应用程序因以下错误而终止: * 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“* 集合 <__NSCFSet: 0xc5d2b40> 在枚举时发生了变化。”

当我执行 po 0xc5d2b40 时,它告诉我它是某种对象类型的数组。然而,当我在所有异常处打开断点并进行回溯时,没有任何迹象表明该对象类型的数组被枚举或变异。

我看到一些引用资料表明这可能与 coredata 和多线程有关,但我想知道是否有人对如何解决这个问题有任何建议。我还应该注意:我只在设备上收到此错误,而不是在模拟器中收到此错误。

提前致谢!

注意:当应用程序从 objc_exception_throw 到达断点时,使用 bt 命令我从各个后台线程获得以下结果:

大多数线程如下所示: tid = 0x2c03, 0x307e9cd4 libsystem_kernel.dylib__workq_kernreturn + 8 帧#0:0x307e9cd4 libsystem_kernel.dylib__workq_kernreturn + 8 帧 #1:0x32d35f3c libsystem_c.dylib_pthread_wqthread + 616 帧#2:0x32d35cd0 libsystem_c.dylibstart_wqthread + 8

我有一个线程正在运行 AFURLConnectionOperation(外部库:AFNetworking)中的一种方法。

回溯中有一个带有我的代码的线程,这就是我上面提到的。我对调试器有点陌生,我在检查回溯时是否可能做错了什么?

执行所有代码的线程上的回溯如下所示:

tid = 0x2003, 0x32d2fcac libsystem_c.dylib`OSSpinLockLock$VARIANT$wfe + 84
frame #0: 0x32d2fcac libsystem_c.dylib`OSSpinLockLock$VARIANT$wfe + 84
frame #1: 0x32eb7c88 libobjc.A.dylib`_objc_rootReleaseWasZero_slow + 28
frame #2: 0x32eb5210 libobjc.A.dylib`_objc_rootReleaseWasZero + 132
frame #3: 0x32eb515c libobjc.A.dylib`_objc_rootRelease + 12
frame #4: 0x31ba6b0a CoreData`-[NSSQLIntermediate _generateSQLForKeyPathExpression:allowToMany:inContext:] + 278
frame #5: 0x31ba687a CoreData`-[NSSQLIntermediate _generateSQLForExpression:allowToMany:inContext:] + 186
frame #6: 0x31babea4 CoreData`-[NSSQLSimpleWhereIntermediate _generateSQLType2InContext:] + 660
frame #7: 0x31ba6260 CoreData`-[NSSQLSimpleWhereIntermediate generateSQLStringInContext:] + 400
frame #8: 0x31bbbd06 CoreData`-[NSSQLCompoundWhereIntermediate _generateMulticlauseStringInContext:] + 174
frame #9: 0x31bbba84 CoreData`-[NSSQLCompoundWhereIntermediate generateSQLStringInContext:] + 272
frame #10: 0x31ba5d1a CoreData`-[NSSQLFetchIntermediate generateSQLStringInContext:] + 90
frame #11: 0x31ba24d0 CoreData`-[NSSQLGenerator newSQLStatementForFetchRequest:ignoreInheritance:countOnly:nestingLevel:] + 460
frame #12: 0x31ba2212 CoreData`-[NSSQLAdapter _newSelectStatementWithFetchRequest:ignoreInheritance:] + 414
frame #13: 0x31ba1e6c CoreData`-[NSSQLCore newRowsForFetchPlan:] + 144
frame #14: 0x31ba152e CoreData`-[NSSQLCore objectsForFetchRequest:inContext:] + 698
frame #15: 0x31ba0fc6 CoreData`-[NSSQLCore executeRequest:withContext:error:] + 282
frame #16: 0x31ba0464 CoreData`-[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 1432
frame #17: 0x31b9ec28 CoreData`-[NSManagedObjectContext executeFetchRequest:error:] + 604
frame #18: 0x00052956 digidrill`-[DigidrillIncrementalCache executeFetchRequest:allNewerThanOrFailure:] + 410 at DigidrillIncrementalCache.m:80
frame #19: 0x0003fbae digidrill`-[DigidrillIncrementalStore(Responders) immutableCacheListResponderBegin:intoArray:inContext:outErr:] + 434 at DigidrillIncrementalStore+Responders.m:253
frame #20: 0x00015ea4 digidrill`-[DigidrillIncrementalStore executeRequest:withContext:error:] + 3836 at DigidrillIncrementalStore.m:157
frame #21: 0x31ba0464 CoreData`-[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 1432
frame #22: 0x31b9ec28 CoreData`-[NSManagedObjectContext executeFetchRequest:error:] + 604
frame #23: 0x00018534 digidrill`+[CoreDataExtractor executeSyncFetchRequest:callback:onDispatchQueue:] + 704 at CoreDataExtractor.m:175
frame #24: 0x0001a9a2 digidrill`+[CoreDataExtractor ensureGammaDataExistsForTrack:maxOld:flags:outErr:] + 1234 at CoreDataExtractor.m:363
frame #25: 0x00058670 digidrill`-[XYGraph dataForTrackPlot:] + 632 at XYGraph.m:230
frame #26: 0x0006f7d6 digidrill`__23-[TrackPlot reloadData]_block_invoke_0 + 66 at TrackPlot.m:49
frame #27: 0x344b0c58 libdispatch.dylib`_dispatch_call_block_and_release + 12
frame #28: 0x344b2d0e libdispatch.dylib`_dispatch_queue_drain + 274
frame #29: 0x344b2b74 libdispatch.dylib`_dispatch_queue_invoke$VARIANT$mp + 40
frame #30: 0x344b37e6 libdispatch.dylib`_dispatch_worker_thread2 + 210
frame #31: 0x32d35dfa libsystem_c.dylib`_pthread_wqthread + 294
frame #32: 0x32d35cd0 libsystem_c.dylib`start_wqthread + 8

最佳答案

这个人有一个很好的解释,为我解决了这个问题:

http://www.pixeldock.com/blog/collection-was-mutated-while-being-enumerated-during-coredata-operation-on-background-thread/

基本上,MO 上下文只能由创建它的线程使用。

关于objective-c - 使用 coredata 和多线程枚举时集合发生了变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12204932/

相关文章:

ios - 如何在iOS swift4的for循环中更改标签文本?

ios - Alamofire Xcode 8 Swift 3 导致 786 个编译错误

使用 "private final Lock"的 Java 锁定和同步结果不相同

multithreading - 我可以混合搭配 InterlockedIncrement 和 CriticalSection 吗?

objective-c - 正确的权利标志将文件保存在同一位置两次

ios - NSNumber存储 float 。请没有科学记数法吗?

objective-c - Objective C 中的工厂(设计模式)

ios - Swift 相当于 `[NSDictionary initWithObjects: forKeys:]`

c# - 未经授权的访问异常 : Access to the path [ iOS/Unity3D ]

java - JProgressBar 不更新,找不到线索