2015-05-12 44 views
1

我昨天開始學習Swift for IOS,並試圖製作一個簡單的登錄應用程序。這是我的快捷文件Swift回調更改UIViewController標籤

import Foundation 
import SwiftHTTP 

func printSomething (sentence: String) { 
    println(sentence); 
} 

func makeLoginCall(user: String, pwd: String, doneFunction : (Bool) -> Void) { 

    var url : String = "myurl" 

    var request = HTTPTask() 

    request.requestSerializer = JSONRequestSerializer() 
    request.responseSerializer = JSONResponseSerializer() 

    request.POST(url, 
     parameters : ["username": user, "password": pwd], 
     success: {(response: HTTPResponse) in 
       if let dict = response.responseObject as? Dictionary<String, AnyObject> { 
      println("\(dict)") 
      doneFunction(true) 
     } 
     }, failure: {(error: NSError, response: HTTPResponse?) in 
      println("error \(error)") 
      doneFunction(false) 
    }) 

} 

,這是我的ViewController

import UIKit 

class ViewController: UIViewController { 

@IBOutlet weak var userTextField: UITextField! 

@IBOutlet weak var passTextField: UITextField! 

@IBOutlet var resultLabel: UILabel! 


override func viewDidLoad() { 
    super.viewDidLoad() 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


@IBAction func loginButtonCallback(sender: AnyObject) { 
    checkLogin() 
} 

func checkLogin() { 
    var user : String = userTextField.text 
    var pass : String = passTextField.text 

    makeLoginCall(user, pass, printResult) 
} 

func printResult(result: Bool) -> Void { 
    println("print result function started") 
    if (result) { 
     resultLabel.text = "Login done" 
    } else { 
     resultLabel.text = "Login wrong" 
    } 
} 
} 

現在printResult函數被調用但標籤不會改變。 什麼問題?

回答

1

您的printResult函數異步運行。

所有的UI更改必須分派到主隊列

要返回到主隊列使用:

dispatch_async(dispatch_get_main_queue(), ^{ 
    doneFunction(…) 
}); 

POST請求

+0

太棒了!現在它可以工作。但是,這是做到這一點的正確方法嗎? –

+0

由於您是通過使用異步函數調度它的,所以這確實是一條可行的路。你也可以(如克里希納所建議的那樣)將調度函數放入你的doneFunction中,這將使得你只需要一次調度代碼。 – milo526

2

您完成塊中寫下您的代碼主線程將這樣與UI交互:

dispatch_async(dispatch_get_main_queue(), {() -> Void in 
     if (result) { 
        resultLabel.text = "Login done" 
     } else { 
       resultLabel.text = "Login wrong" 
    } 
})