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