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

how to modify data in an asynchronous URLrequest in swift before reaching the return statement

我开始学习 ios 开发有一段时间了,我已经到了尝试从服务器发送和接收数据的部分。 我 运行 遇到了一个问题,例如,如果我想使用 异步连接 让用户登录或注册他。使用 swiftyjson 的数据管理器 class 上的代码示例:

    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 "error"(默认值),因为 return 语句在状态字符串被修改之前被执行。 如果我重复相同的代码但使用同步连接它工作正常,但我问的每个人都告诉我要避开同步连接,因为它们在执行时冻结 UI 有没有一种无需使用 同步连接 即可处理此问题的方法?或者这是唯一的方法?有没有更好的方法来处理请求中的符号 up/sign 或一般的任何请求? 谢谢

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

使用完成处理程序代替 return 语句。
完成处理程序将在您的语句完成时调用,而不是在它到达函数末尾时调用。

我之前提到的link有下面这个例子

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

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

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

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

放置在数据管理器中:

    class func signUp(username : String , completion: (status : NSString)->Void) {
    var url: NSURL = NSURL(string: "http://localhost/WhosIn/signup.php")!
    var request:NSMutableURLRequest = NSMutableURLRequest(URL:url)
    var bodyData = "username=Datforis&name=firas&password=123"
    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){
                completion(status: status)
            }
            else if data == nil {
                println("Server could not be reached please check your internet connection")
                status = "connectionerror"
                completion(status: status)
            }
            else {
                println("i'm here")
                let json = JSON(data : data)
                var msgint : Int = json["status"].int!
                status = String(msgint)
                println(status)
                completion(status: status)
            }
        }
}

尝试运行函数时放置在视图控制器中

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

    println(status)
})