Здесь ситуация:NSArrayController поддерживается модификация массива в фоновом потоке
- NSTableView связан с NSArrayController
NSArrayController связанного с массивом AnalysisResult объектов
dynamic var analysisResults: [AnalysisResult] = [AnalysisResult]() // model for table view via resultsArrayController
NSTableView имеет столбец «результат», связанный с AnalysisResult.value
Теперь, когда пользователь нажимает кнопку, он запускает анализ в фоновом потоке и изменяет объекты в «AnalysisResults». Он НЕ добавляет и не удаляет какой-либо объект из массива. Он просто изменяет свойство «value» объектов AnalysisResult.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
for (index, curAnalysisRes) in self.analysisResults.enumerate() {
curAnalysisRes.value = "some new value" // simplified but the value can be updated in many different places of the algorithm
}
dispatch_sync(dispatch_get_main_queue()) {
/* Ask the tableview to reload data in main UI thread */
self.myTableView.reloadData()
}
}
После анализа в потоке пользовательского интерфейса предлагается обновить представление таблицы.
НО вот проблема: я получаю следующее предупреждение:
CoreAnimation: warning, deleted thread with uncommitted CATransaction; created by:
0 QuartzCore 0x00007fff8f06369a _ZN2CA11Transaction4pushEv + 318
1 QuartzCore 0x00007fff8f06319a _ZN2CA11Transaction15ensure_implicitEv + 276
2 QuartzCore 0x00007fff8f069719 _ZN2CA5Layer13thread_flags_EPNS_11TransactionE + 37
3 QuartzCore 0x00007fff8f069668 _ZN2CA5Layer4markEPNS_11TransactionEjj + 64
4 QuartzCore 0x00007fff8f06b12b _ZN2CA5Layer25set_needs_display_in_rectERK6CGRect + 333
5 QuartzCore 0x00007fff8f06afdc -[CALayer setNeedsDisplayInRect:] + 25
6 AppKit 0x00007fff872d12e8 _NSBackingLayerSetNeedsDisplayInRect + 319
7 AppKit 0x00007fff872d11a3 -[_NSBackingLayer setNeedsDisplayInRect:] + 61
8 QuartzCore 0x00007fff8f06af9d -[CALayer setNeedsDisplay] + 62
9 AppKit 0x00007fff872d198b -[NSView(NSInternal) _setLayerNeedsDisplayInViewRect:] + 606
10 AppKit 0x00007fff8729f88e NSViewSetNeedsDisplayInRect + 945
11 AppKit 0x00007fff8729f4d6 -[NSView setNeedsDisplayInRect:] + 48
12 AppKit 0x00007fff8729f2ed -[NSView setNeedsDisplay:] + 81
13 AppKit 0x00007fff872f2be1 -[NSTextFieldCell setObjectValue:] + 88
14 AppKit 0x00007fff873e3026 -[NSControl setObjectValue:] + 135
15 AppKit 0x00007fff873ce0c6 -[_NSPlaceholderTextFieldPlugin showValue:inObject:] + 110
предупреждение вызвано путем изменения массива, связанный с arraycontroller. Я не хочу выполнять анализ в основном потоке, потому что он замораживает пользовательский интерфейс.
Как я могу избежать предупреждения?