我對Swift編程語言,製作圖形用戶界面以及通常使用異步調度相當陌生,因此請原諒這個我想象得到的問題有一個令人難以忍受的簡單答案。Swift中的異步調度資源豬
我試圖做的是根據是否選擇有效設置,禁用並重新啓用GUI中的Next
按鈕。這些設置可在兩個複選框和一個文本字段中找到。
我的想法是在後臺持續檢查設置,如果有效,啓用Next
按鈕。此代碼塊是我最近的嘗試:
func checkValidSettings() {
let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
while true {
if self.textField.stringValue == "Test" {
dispatch_async(dispatch_get_main_queue()) {
self.nextButton.enabled = false
}
} else if (self.checkBox1.state == NSOffState && self.checkBox2.state == NSOffState){
dispatch_async(dispatch_get_main_queue()) {
self.nextButton.enabled = false
}
} else {
dispatch_async(dispatch_get_main_queue()) {
self.nextButton.enabled = true
}
}
}
}
}
雖然這可以正常運行,它會導致應用程序是一個巨大的資源豬(100%的CPU和內存的幾個GB),我以爲是因爲一噸的後臺任務正在創建。我弄得很糟糕,哈哈。
我的問題是:我應該如何構建while
循環,以便它不斷檢查設置,同時不佔用我所有的資源?還是有更簡單的GUI管理方法?
在此先感謝您的任何建議或幫助您可以給!
爲什麼循環?只要檢查價值變化的條件。你可以爲它註冊回調。你的代碼也不是線程安全的。您無法從非主線程訪問UI元素。 –
你知道,這比我想要做的更有意義,哈哈。如何檢查價值變化時的條件? – humcat
https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTextField_Class/#//apple_ref/occ/instm/NSTextField/textDidChange: –