集合被枚举崩溃时发生了变化NSTableView,NSArrayController和NSThread

问题描述:

在我的小型核心数据应用程序中,我有一些NSTableView视图绑定在实体模式下的NSArrayController控制器。集合被枚举崩溃时发生了变化NSTableView,NSArrayController和NSThread

当我尝试导入数据的一些大的量,以我的表在后台线程,一些成功添加进口后(从几十元到几百个项目),我得到的碰撞与日志:

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

...和堆栈跟踪:

#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 

假设有与更新表(列举并非线程安全)的问题,我试图解决此问题通过禁用控制器和表导入之前开始使用:

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

但它没有帮助。在导入期间,我仍然看到新的实体被添加到故事中直到崩溃。

任何人都知道什么是禁用NSArrayController跟踪后台处理时间的变化?或者也许这是其他问题?

非常感谢您的任何提示。

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

这也可能是因为插入到阵列控制器正在刷新的同一上下文中。在这种情况下,您需要在“显示结果”上下文中使用单独的“导入”上下文。在导入期间,您将合并每个导入对象的上下文,以允许刷新“显示结果”上下文。

+1

我不在导入代码中使用交互,但是您正确地使用第二件事:我使用相同的托管对象上下文来导入和显示。我将尝试为后台线程使用另一个托管对象上下文。 – Lukasz 2010-10-13 17:23:40

我在避免与被禁用的TableView是错误的成功:

[table setHidden:YES] 

开始将项目添加到我的ArrayController之前。

+0

您可能将此误解为解决方案,因为此错误取决于线程速度。提高你的答案,因为它不值得-1。 – evdude100 2011-12-06 17:18:16