gpt4 book ai didi

multithreading - 枚举时集合发生突变,导致 NSTableView、NSArrayController 和 NSThread 崩溃

转载 作者:行者123 更新时间:2023-12-03 17:32:45 25 4
gpt4 key购买 nike

在我的小型 Core Data 应用程序中,我有一些 NSTableView View 在实体模式下与 NSArrayController Controller 绑定(bind)。

当我尝试在后台线程中将大量数据导入到我的表中时,在成功添加一些导入(从数十到数百项)后,我会崩溃并显示日志:

严重的应用程序错误。核心数据更改处理期间捕获异常:*** 枚举时集合发生变异。NSHashTable (%@) {[5](实体:Word;id:0x1001dd4b0;数据:{.......此处实体描述.... } ....

...和堆栈跟踪:

#0  0x7fff83e0e2fa in mach_msg_trap
#1 0x7fff83e0e96d in mach_msg
#2 0x7fff8816c614 in _CGSSynchronizeWindowBackingStore
#3 0x7fff88152169 in _CGSLockWindow
#4 0x7fff88158cff in CGSDeviceLock
#5 0x7fff81ecae43 in ripd_Lock
#6 0x7fff81eca746 in ripl_BltShape
#7 0x7fff81ec7d86 in ripc_Render
#8 0x7fff81ec5317 in ripc_DrawRects
#9 0x7fff88158641 in CGContextFillRects
#10 0x7fff8818ee1a in CGContextFillRect
#11 0x7fff86e712f8 in NSRectFillUsingOperation
#12 0x7fff86f2152e in NSDrawWindowBackground
#13 0x7fff86ea16c2 in -[NSThemeFrame drawWindowBackgroundRect:]
#14 0x7fff86e6eb9a in -[NSFrameView drawThemeContentFill:inView:]
#15 0x7fff86e68aa5 in -[NSThemeFrame drawRect:]
#16 0x7fff86e68131 in -[NSView _drawRect:clip:]
#17 0x7fff86e65907 in -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:]
#18 0x7fff86e64ee8 in -[NSThemeFrame _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:]
#19 0x7fff86e6179a in -[NSView _displayRectIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:]
#20 0x7fff86ddaff6 in -[NSView displayIfNeeded]
#21 0x7fff86dd5ea2 in _handleWindowNeedsDisplay
#22 0x7fff80099a2d in __NSFireTimer
#23 0x7fff815aa678 in __CFRunLoopRun
#24 0x7fff815a884f in CFRunLoopRunSpecific
#25 0x7fff82c3991a in RunCurrentEventLoopInMode
#26 0x7fff82c3971f in ReceiveNextEventCommon
#27 0x7fff82c395d8 in BlockUntilNextEventMatchingListInMode
#28 0x7fff86dab29e in _DPSNextEvent
#29 0x7fff86daabed in -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:]
#30 0x7fff86d708d3 in -[NSApplication run]
#31 0x7fff86d695f8 in NSApplicationMain

假设更新表存在问题(枚举不是线程安全的),我尝试通过在导入开始之前禁用 Controller 和表来解决此问题:

[wordsController setEditable:NO];
[wordsController setAutomaticallyPreparesContent:NO];
[wordsTable setEnabled:NO];

但这并没有帮助。在导入过程中,我仍然看到新实体被添加到故事中,直到崩溃。

有人知道禁用 NSArrayController 在后台处理期间跟踪更改的技巧是什么吗?或者也许这是其他问题?

非常感谢您的任何提示。

最佳答案

您是否在导入或 UI 更新中使用快速枚举(“for (id object in collection) {...}”)?如果是这样,请注意您无法在枚举期间修改集合(添加或删除)。

这也可能是插入到刷新数组 Controller 的同一上下文中的结果。在这种情况下,您需要一个与“显示结果”上下文分开的“导入”上下文。在导入过程中,您将合并每个 x 个导入对象的上下文,从而允许刷新“显示结果”上下文。

关于multithreading - 枚举时集合发生突变,导致 NSTableView、NSArrayController 和 NSThread 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3925054/

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