Swift回调改变UIViewController标签

Swift Callback change UIViewController Label

我昨天开始研究 Swift IOS,我正在尝试制作一个简单的登录应用程序。这是我的 swift 文件

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 函数,但标签不会改变。 有什么问题吗?

您的 printResult 函数异步运行。

所有 UI 更改必须分派到主队列

返回主队列使用:

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

在 POST 请求的完成块中

在将与 UI 交互的主线程中编写您的代码,如下所示:

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