gpt4 book ai didi

ios - 使用 AFIncrementalStore 和 NSFetchedResultsController 的死锁

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:18:26 24 4
gpt4 key购买 nike

几天来我一直在为此苦苦思索,终究无法弄清楚到底发生了什么。我不太熟悉 Core Data,但我对它的了解足以避免出现死锁情况。然而,对于这个项目,我决定尝试合并 AFIncrementalStore。我构建了一个示例项目来测试 APIClient,以便在不影响我的实际项目的情况下适本地映射键/值。它运行完美。

现在我在我的实际项目中使用它,但事情很挑剔。 NSFetchedResultsController 在 UITableViewController 中使用,该 UITableViewController 被推离屏幕(类似于 Facebook 应用程序的菜单滑动)。大约 50% 的时间我不会陷入僵局。我已确保 NSFetchedResultsController managedObjectContext 与我的 AppDelegate 相同。几乎所有设置都与 AFIncrementalStore 示例相同。即使是我测试使用情况的示例项目也能完美运行。

这是我在死锁期间暂停时调试导航器的图像。看起来问题出在 AFIncrementalStore 的后台上下文和主线程的上下文之间。但是,我不确定该怎么做,因为我没有编写 AFIncrementalStore 并且只是从现有的文档/示例开始。

Debug Navigator

编辑:添加第二个线程的回溯

thread #2: tid = 0x2103, 0x925d180e libsystem_kernel.dylib`semaphore_wait_trap + 10
frame #0: 0x925d180e libsystem_kernel.dylib`semaphore_wait_trap + 10
frame #1: 0x0258cf08 libdispatch.dylib`_dispatch_thread_semaphore_wait + 16
frame #2: 0x0258ab3a libdispatch.dylib`_dispatch_barrier_sync_f_slow + 149
frame #3: 0x0258aa5c libdispatch.dylib`dispatch_barrier_sync_f + 37
frame #4: 0x00b64c8b CoreData`_perform + 187
frame #5: 0x00b67659 CoreData`-[NSManagedObjectContext(_NestedContextSupport) managedObjectContextDidUnregisterObjectsWithIDs:] + 73
frame #6: 0x00bdf2db CoreData`__97-[NSManagedObjectContext(_NestedContextSupport) managedObjectContextDidUnregisterObjectsWithIDs:]_block_invoke_0 + 75
frame #7: 0x00b64cc1 CoreData`internalBlockToNSManagedObjectContextPerform + 17
frame #8: 0x0259b014 libdispatch.dylib`_dispatch_client_callout + 14
frame #9: 0x0258ad5f libdispatch.dylib`_dispatch_barrier_sync_f_invoke + 58
frame #10: 0x0258aaa3 libdispatch.dylib`dispatch_barrier_sync_f + 108
frame #11: 0x00b64c8b CoreData`_perform + 187
frame #12: 0x00b67659 CoreData`-[NSManagedObjectContext(_NestedContextSupport) managedObjectContextDidUnregisterObjectsWithIDs:] + 73
frame #13: 0x00b71c8c CoreData`-[NSManagedObjectContext(_NSInternalAdditions) _disposeObjects:count:notifyParent:] + 444
frame #14: 0x00b71305 CoreData`-[NSManagedObjectContext(_NSInternalAdditions) _dispose:] + 597
frame #15: 0x00b70e15 CoreData`-[NSManagedObjectContext _dealloc__] + 325
frame #16: 0x00bd872f CoreData`internalBlockToDeallocNSManagedObjectContext + 79
frame #17: 0x0259b014 libdispatch.dylib`_dispatch_client_callout + 14
frame #18: 0x0258b418 libdispatch.dylib`_dispatch_queue_drain + 239
frame #19: 0x0258b2a6 libdispatch.dylib`_dispatch_queue_invoke + 59
frame #20: 0x0258c280 libdispatch.dylib`_dispatch_root_queue_drain + 231
frame #21: 0x0258c450 libdispatch.dylib`_dispatch_worker_thread2 + 39
frame #22: 0x971cde12 libsystem_c.dylib`_pthread_wqthread + 441

最佳答案

此问题并非特定于 AFIncrementalStore 的使用。我们在使用嵌套上下文和 NSFetched 结果 Controller 时遇到了同样的事情。

子上下文和兄弟上下文不需要使用相同的并发类型,也不需要使用相同的线程。但是,您的获取结果 Controller 必须在其托管对象上下文使用的同一线程上使用,调试导航器中的线程 2 NSManagedObjectContext 队列让我认为这可能是线程问题。

如果这是你的主要上下文,有时这就像这样包装你的 fetth 一样简单

dispatch_async(dispatch_get_main_queue(), ^{ [resultsController performFetch:nil]; });

或者对于真正的偏执狂

[_resultsController.managedObjectContext performBlock:^{
[_resultsController performFetch:nil];
}];

这些死锁有很多东西,试试herehere对于堆栈溢出的帖子。

关于ios - 使用 AFIncrementalStore 和 NSFetchedResultsController 的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15077982/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com