Коллекция была видоизменена при сбое перечисления с помощью NSTableView, NSArrayController и NSThread - PullRequest
0 голосов
/ 13 октября 2010

В моем небольшом приложении Core Data у меня есть несколько представлений NSTableView, связанных с контроллерами NSArrayController в режиме Entity.

Когда я пытаюсь импортировать большой объем данных в мою таблицу в фоновом потоке, после нескольких успешно добавленных импортов (от десятков до сотен элементов) я получаю сбой с журналом:

Серьезная ошибка приложения. Исключительная ситуация была обнаружена во время обработки изменения базовых данных: *** Коллекция была видоизменена во время перечисления.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

Предполагая, что существует проблема с обновлением таблицы (перечисление не является потокобезопасным), я попытался решить эту проблему, отключив контроллер и таблицу перед началом импорта, используя:

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

но это не помогает. Во время импорта я все еще вижу новые сущности, добавляемые в рассказ до сбоя.

Кто-нибудь знает, как можно отключить NSArrayController от отслеживания изменений во время фоновой обработки? А может, здесь другая проблема?

Большое спасибо за любые подсказки.

Ответы [ 2 ]

4 голосов
/ 13 октября 2010

Используете ли вы быстрое перечисление ("for (id объект в коллекции) {...}") в вашем импорте или обновлении пользовательского интерфейса? Если это так, обратите внимание, что вы не можете изменить коллекцию (добавить или удалить) во время перечисления.

Также возможно, что это результат вставки в тот же контекст, из которого обновляется контроллер массива. В этом случае вам понадобится отдельный контекст «импорта» из контекста «отображения результатов». Во время импорта вы будете объединять контексты через каждый x импортированных объектов, что позволяет обновлять контекст «отображения результатов».

0 голосов
/ 27 ноября 2010

Мне удалось избежать этой ошибки, отключив TableView:

[table setHidden:YES]

перед тем, как начать добавлять элементы в мой ArrayController.

...