Swift代码中非常奇怪的问题.延迟操作



我有一个很奇怪的问题我无法解决。我正在用swift开发一个iOS应用。在一个类(a类)中,我调用另一个类(B类)来连接到服务器。这个服务器返回一个json,我将结果传递给a类,但是我得到了我希望的操作的重要延迟。

下面是A类的代码:

    func loginUser () {

    //check for data
    if txt_mail!.text == "" || txt_password!.text == ""{
        var alertView = UIAlertView(title: "Error", message: "no data", delegate: nil, cancelButtonTitle: "OK")
        alertView.show()
    }
    else
    {
        //save data and login
        var data:NSMutableDictionary = NSMutableDictionary(objects: [txt_mail!.text, txt_password!.text], forKeys: ["email", "password"])
        loginUserClass().loginUser(data)

    }
}

在B类我有:

 func loginUser (data:NSMutableDictionary) {

    var success_login:Int = 0
    userData = data
    //request for login
    var request = NSMutableURLRequest(URL: NSURL(string: "http://link_to_server")!)
    var session = NSURLSession.sharedSession()
    request.HTTPMethod = "POST"
    let email:String = userData.valueForKey("email") as! String
    let password:String = userData.valueForKey("password") as! String
    let auth:NSMutableDictionary = ["email":email,"token":password]

    var err: NSError?
    request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: &err)
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")
    var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
        var err: NSError?
        var json_return_server = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSDictionary
        if(err != nil) {
            //error
             success_login = 0
        }
        else {
             success_login = 1
            }
        }

        /*
        Now I call another func in class A for "working" the result
        */
        dispatch_async(dispatch_get_main_queue(), {
            loginWithMailScreen().LoginUser_result(success_login)
        })

    })
    task.resume()


}

所以在类A中工作的函数是:

 func LoginUser_result (success:Int) {
    if success == 1{
        print("Success...")
        let alert = UIAlertView(title: "Good", message: "Success...", delegate: nil, cancelButtonTitle: "Ok")
        alert.show()

    }
    else if success == 0{
        print("Error...")
        let alert = UIAlertView(title: "Error", message: "I'm sorry", delegate: nil, cancelButtonTitle: "Ok")
        alert.show()
    }

}
这很奇怪,因为控制台打印"成功…"或"错误…"非常快,但应用程序显示警报大约10秒后!!知道原因和我该如何解决吗??

PS:抱歉我的英语不好,我是意大利人

编辑:我认为服务器是非常快的,事实上就像我说我有正确的结果(0错误的邮件/密码,1正确的邮件/密码)。奇怪的行为,我猜,是警报的延迟

我按照Sulthan的建议编辑我的代码。这样的代码还有另一个问题。事实上,我得到警报没有问题(没有延迟),但没有其他功能是可能的(解散不工作)!!

任何想法?

你正在从后台线程更新ui。你只能从主线程更新UI。

dispatch_async(dispatch_get_main_queue(), {
  loginWithMailScreen().loginUser_result(success_login)
})

最新更新