2017-02-08 72 views
1

的Xcode 8.2.1/MacOS的10.12.4測試這是什麼原因造成的? - 「CoreAnimation:警告,已刪除的主題有未提交CATransaction」

我試圖理解一個錯誤我越來越:

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. 

我有在該發送網絡請求迅速文件代碼塊,檢索一些數據,併發佈一個通知之前對其進行處理:

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

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

以我主ViewController.swift文件,觀察者偵聽通知和更新視圖。

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

override func viewDidLoad() { 
    super.viewDidLoad() 

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

} 

updateView()被調用時,實際的文本字段和這種利用一個隨機時間以實際更新,和前面提到的錯誤出現。

我的猜測是,有與線程安全的問題,所以我改變updateView()像這樣:

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

現在正確的視圖更新。但是我仍然對編程相對缺乏經驗,並且我不太明白導致錯誤的原因。

+0

選中此:https://www.quora.com/Iphone-why-update-UI-always-on-Main-Thread –

回答

1

您的通知處理程序(updateView)是從任意線程調用的 - 例如,不是從主線程(所謂的UI-Thread)。幾個框架API檢測它們是否從主線程外被調用(作爲一種警告)。

如果您想更新UI,您必須確保此代碼在主線程中執行;這通常通過將封閉(工作項目)排列爲DispatchQueue.main.async(其是GCD的一部分(Grand Central Dispatch))來實現。

相關問題