2016-07-29 9 views
0

Здесь ситуация: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. Я не хочу выполнять анализ в основном потоке, потому что он замораживает пользовательский интерфейс.

Как я могу избежать предупреждения?

ответ

0

OK Я нашел решение здесь, и это было довольно просто.

Поскольку я изменял значения массива, связанные с NSArrayController, и поскольку контроллер связан с NSTableView (таким образом, связанный с UI), я явно делал UI-файл не в основном потоке пользовательского интерфейса.

С технической точки зрения, так как привязки какао используют KVO (ключ-значение наблюдения), то уведомления об изменениях, спровоцированные моих модификации в массиве, размножал в потоке не-UI, в результате чего последнее упоминались сообщение:

CoreAnimation: warning, deleted thread with uncommitted CATransaction; 

Кроме того, интересный побочный эффект, кусок кода:

self.myTableView.reloadData() 

не нужно больше, потому что уведомления КВО в настоящее время распространяются должным образом в UI-потоке.

 Смежные вопросы

  • Нет связанных вопросов^_^