Ios 从方法同步返回REST调用的响应

Ios 从方法同步返回REST调用的响应,ios,swift,rest,promise,ios9,Ios,Swift,Rest,Promise,Ios9,我创建了一个方法来执行REST调用并返回HTTP响应代码: import Foundation class RestUtil{ enum HTTPMethod: String{ case GET, POST, PUT } static func sendREST(url: String, data: String, httpMethod: HTTPMethod) -> String{ let request = NSMutableUR

我创建了一个方法来执行REST调用并返回HTTP响应代码:

import Foundation

class RestUtil{

enum HTTPMethod: String{
        case GET, POST, PUT
    }

    static func sendREST(url: String, data: String, httpMethod: HTTPMethod) -> String{

        let request = NSMutableURLRequest(URL: NSURL(string: url)!)
        let dataEncoded = data.dataUsingEncoding(NSUTF8StringEncoding)

        request.HTTPMethod = httpMethod.rawValue
        request.HTTPBody = dataEncoded

        print("HTTPMethod: " + httpMethod.rawValue)

        var statusCode : Int = 0
        let startTime : Double = NSDate().timeIntervalSince1970

        func completionFunc(data: NSData?, response: NSURLResponse?, error: NSError?){
            let httpResponse = response as! NSHTTPURLResponse
            statusCode = httpResponse.statusCode
            print("statusCode: " + String(statusCode))
            print(error)
        };

        let task = NSURLSession.sharedSession().uploadTaskWithRequest(request,
                                                                      fromData: dataEncoded!,completionHandler: completionFunc)


        task.resume()
        var currentTime : Double = NSDate().timeIntervalSince1970
        var elapsedTime : Double = (currentTime - startTime)
        let timeOut : Double = 10

        while(statusCode == 0 && elapsedTime < timeOut){
            sleep(1);
            currentTime = NSDate().timeIntervalSince1970
            elapsedTime = (currentTime - startTime)
        }

        print("Final elapsedTime: " + String(elapsedTime))

        return String(statusCode)
    }

}
<代码>导入基础 类RestUtil{ 枚举HTTPMethod:字符串{ 箱子,箱子 } 静态func sendREST(url:String,data:String,httpMethod:httpMethod)->String{ let request=NSMutableURLRequest(URL:NSURL(string:URL)!) 让dataEncoded=data.dataUsingEncoding(NSUTF8StringEncoding) request.HTTPMethod=HTTPMethod.rawValue request.HTTPBody=dataEncoded 打印(“HTTPMethod:+HTTPMethod.rawValue) 变量状态代码:Int=0 让startTime:Double=NSDate().时间间隔自1970年起 函数完成函数(数据:NSData?,响应:NSURLSERPONSE?,错误:NSError?){ 让httpResponse=响应为!NSHTTPURLResponse statusCode=httpResponse.statusCode 打印(“状态代码:+字符串(状态代码)) 打印(错误) }; 让task=NSURLSession.sharedSession().uploadTaskWithRequest(请求, fromData:dataEncoded!,completionHandler:completionFunc) task.resume() var currentTime:Double=NSDate().时间间隔1970 变量elapsedTime:Double=(当前时间-开始时间) let timeOut:Double=10 while(statusCode==0&&elapsedTime 该方法执行REST调用并从服务器返回HTTP状态代码。该方法的目的是让调用方法在完成REST调用时从REST调用中获取返回代码,而不必提供回调函数来处理响应状态代码,即该方法应该是同步的(就像现在一样)


它可以工作,但是在循环检查是否有响应时感觉有点笨拙。实现此方法适当功能的最简单方法是什么(以便在返回代码可用时立即返回),最好是不使用外部库?这是否可行,例如使用?

是。投票从来不是一个好主意。异步调用的典型模式是为函数提供一个完成处理程序闭包,就像使用
uploadTaskWithRequest
一样。异步网络操作完成后,执行闭包以使调用方能够对结果执行任何需要执行的操作。实际上,您不能从函数返回值。Swift中的承诺没有内置的支持。您可以使用它,看起来您试图在代码中实现的是同步而不是异步使用NSURLSession。这是Erica Sadun提供的代码。但通常情况下,您会希望使用回调或委托(NSURLSessionAskdelegate)来监视上载,并在任务结束时通知您,以便如Paulw11所述,您可以采取行动。感谢链接,看起来不错。我知道在很多情况下,异步处理方法调用链是有好处的(例如,如果同时有几个调用,或者应用程序代码可以在不等待结果的情况下继续进行)。然而,如果用例本质上是同步的,我发现同步处理会使代码更具可读性-我必须等待代码在某个地方执行,那么我为什么要推回调函数?@Simon由于系统资源的原因,你应该小心。如果你“等待”,你就阻塞了一个线程。这个线程必须挂起,然后再恢复,这总是很昂贵的(就CPU周期而言)。阻塞主线程尤其糟糕,因为您阻塞了UI。用户会认为应用程序崩溃了。至少它变得不可用了。在这种情况下,使用异步方法,它不会阻塞任务,而是在任务完成时继续,并节省系统资源(例如线程、CPU周期和电池)。是的。投票从来不是一个好主意。异步调用的典型模式是为函数提供一个完成处理程序闭包,就像使用
uploadTaskWithRequest
一样。异步网络操作完成后,执行闭包以使调用方能够对结果执行任何需要执行的操作。实际上,您不能从函数返回值。Swift中的承诺没有内置的支持。您可以使用它,看起来您试图在代码中实现的是同步而不是异步使用NSURLSession。这是Erica Sadun提供的代码。但通常情况下,您会希望使用回调或委托(NSURLSessionAskdelegate)来监视上载,并在任务结束时通知您,以便如Paulw11所述,您可以采取行动。感谢链接,看起来不错。我知道在很多情况下,异步处理方法调用链是有好处的(例如,如果同时有几个调用,或者应用程序代码可以在不等待结果的情况下继续进行)。然而,如果用例本质上是同步的,我发现同步处理会使代码更具可读性-我必须等待代码在某个地方执行,那么我为什么要推回调函数?@Simon由于系统资源的原因,你应该小心。如果你“等待”,你就阻塞了一个线程。这个线程必须挂起,然后再恢复,这总是很昂贵的(就CPU周期而言)。阻塞主线程尤其糟糕,因为您阻塞了UI。用户会认为应用程序崩溃了。至少它变得不可用了。在这种情况下,使用异步方法,它不会阻塞任务,而是在任务完成时继续,并且