如何在到达return语句之前在swift中修改异步URLrequest中的数据

时间:2015-04-23 12:16:17

标签: ios swift asynchronous nsurlconnection synchronous

我已经开始学习ios开发了一段时间,我已经到达了我试图从服务器发送和接收数据的部分。 我遇到了一个问题,例如,如果我想使用异步连接在用户中签名或注册。使用swiftyjson的datamanager类的代码示例:

    class func signUp() -> NSString {
    var url: NSURL = NSURL(string: "http://localhost/Test/signup.php")!
    var request:NSMutableURLRequest = NSMutableURLRequest(URL:url)
    var bodyData = "username=Datforis&name=firas&password=123123"
    request.HTTPMethod = "POST"
    request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding);
    var status = "error"
    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue())
        {

            (response, data, error) in
            println(response)
            if(error != nil){
                //handleerror
            }
            else if data == nil {
                println("Server could not be reached please check your internet connection")
                status = "connectionerror"
            }
            else {
                println("i'm here")
                let json = JSON(data : data)
                var msgint : Int = json["status"].int!
                status = String(msgint)
                println(status)
            }
        }

    println(status + " is current" )


    return status //returns status if sign up was successful or not
}

代码将始终返回"错误" (默认值)因为在修改状态字符串之前正在执行return语句。 如果我重复相同的代码但使用同步连接它可以正常工作,但我问的每个人都告诉我要避开同步连接,因为它们会在执行时冻结UI 有没有办法处理这个,而不必使用同步连接?或者这是唯一的方法?是否有更好的方法来处理注册/登录请求或一般的任何请求? 感谢

2 个答案:

答案 0 :(得分:1)

我建议你看一下关于完成处理程序的this文章。

使用完成处理程序而不是返回语句 完成处理程序将在语句完成时调用,而不是在函数结束时调用。

我之前提到的链接有以下示例

func hardProcessingWithString(input: String, completion: (result: String) -> Void) {
    …
    completion(“we finished!”)
}

这可以用于数学计算,这需要很长时间,或者在您的情况下,URL请求。要检索您可以使用的数据

hardProcessingWithString(“commands”) {
    (result: String) in
    println(“got back: (result)“)
}

答案 1 :(得分:0)

感谢所选答案我更正了我的代码

放在Datamanager中:

    DataManager.signUp("asdasd", completion: {
    (status) in

    println(status)
})

尝试运行函数时置于View Controller中

.SingleOrDefault()