2016-07-29 4 views
0

Hier ist die Situation:NSArrayController gesicherte Array Modifikation in Hintergrund-Thread

  • NSTableView an einen NSArrayController gebunden
  • NSArrayController auf ein Array von AnalysisResult gebundenen Objekten

    dynamic var analysisResults: [AnalysisResult] = [AnalysisResult]() // model for table view via resultsArrayController 
    
  • Die NSTableView a hat Spalte "Ergebnis" an AnalysisResult.value gebunden

Wenn der Benutzer nun auf eine Schaltfläche klickt, löst er eine Analyse in einem Hintergrund-Thread aus und ändert die Objekte in "analyseResults". Es fügt kein Objekt aus dem Array hinzu oder entfernt es. Es ändert nur die Eigenschaft "value" der AnalysisResult-Objekte.

Nach der Analyse wird der UI-Thread aufgefordert, die Tabellenansicht zu aktualisieren.

aber hier ist das Problem: Ich erhalte die folgende Warnung:

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 

Die Warnung durch Modifizieren der Anordnung gebunden an den Arraycontroller verursacht wird. Ich möchte die Analyse nicht im Hauptthread durchführen, weil sie die Benutzeroberfläche einfriert.

Wie kann ich die Warnung vermeiden?

Antwort

0

OK Ich habe die Lösung hier gefunden, und es war ziemlich einfach.

Da ich die Werte des an den NSArrayController gebundenen Arrays änderte und der Controller an ein NSTableView (also UI-bezogen) gebunden war, habe ich offensichtlich UI-Sachen gemacht, nicht im Haupt-UI-Thread.

Technisch gesehen, da Kakao Bindungen verwenden KVO (Schlüssel-Wert-Beobachtung), wobei die Änderungsbenachrichtigungen durch meine Änderungen in der Anordnung ausgelöst werden, in einem nicht-UI-Thread propagiert wurden, die Aufwärts erwähnte Nachricht verursacht:

CoreAnimation: warning, deleted thread with uncommitted CATransaction; 

Ferner ist ein interessanter Nebeneffekt, das Stück Code:

self.myTableView.reloadData() 

ist nicht mehr notwendig, da die KVO-Benachrichtigungen jetzt korrekt im UI-Thread propagieren.

Verwandte Themen