2017-02-08 3 views
1

Xcode 8.2.1/macOS 10.12.4 betaWas verursacht das? - "Coreanimation: Warnung, gelöscht Gewinde mit ungebundener CATransaction"

Ich versuche, einen Fehler zu verstehen, ich bin immer:

CoreAnimation: warning, deleted thread with uncommitted CATransaction; set CA_DEBUG_TRANSACTIONS=1 in environment to log backtraces, or set CA_ASSERT_MAIN_THREAD_TRANSACTIONS=1 to abort when an implicit transaction isn't created on a main thread. 

Ich habe ein Code-Block in einem schnellen Datei, die eine Netzwerkanfrage sendet, einige Daten abruft und verarbeitet sie, bevor sie eine Meldung veröffentlichen:

// global variable 
var data: [String: Any] = [:] 

func requestData() { 
    ... 
    do { 
     // process data    
     data = processedData       
     NotificationCenter.default.post(name: didProcessData, object: nil) 
     } 
    } catch { 
     ... 
    } 

in meinem Haupt ViewController.swift Datei, hört ein Beobachter für die Meldung und aktualisiert die Ansicht .

func updateView() { 
    // update the view 
    textField.stringValue = "..." 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    NotificationCenter.default.addObserver(self, selector: #selector(updateView), name: didProcessData, object: nil) 

} 

Wenn updateView() wird, die eigentlichen Textfelder genannt und eine solche unbestimmter Zeit nehmen, um tatsächlich zu aktualisieren, und die oben genannte Fehlermeldung angezeigt.

Meine Vermutung war, dass es ein Problem mit Thread-Sicherheit war, so änderte ich updateView() wie so:

func updateView() { 
    DispatchQueue.main.async(execute: { 
     // update the view 
     self.textField.stringValue = "..." 
    }) 
} 

Und nun die Ansicht aktualisiert richtig. Aber ich bin noch relativ unerfahren in der Programmierung, und ich verstehe nicht genau, was genau den Fehler verursacht.

+0

Überprüfen Sie dies: https://www.quora.com/Iphone-why-update-UI-always-on-Main-Thread –

Antwort

1

Ihr Benachrichtigungshandler (updateView) wird von einem beliebigen Thread aufgerufen - z. nicht aus dem Hauptthread (sog. UI-Thread). Mehrere Framework-APIs erkennen, wenn sie von außerhalb des Hauptthreads aufgerufen werden (als eine Art Warnung).

Wenn Sie die Benutzeroberfläche aktualisieren möchten, müssen Sie sicherstellen, dass dieser Code im Hauptthread ausgeführt wird; Dies wird typischerweise durch Einreihen eines Verschlusses (Arbeitsgegenstand) in DispatchQueue.main.async erreicht, der Teil von GCD (Grand Central Dispatch) ist.

Verwandte Themen