我想创建一个从URL加载数据,然后将responseData作为NSData返回的函数。我想阻塞mainThread直到数据完成。这是我到目前为止的内容:
功能:
typealias CompletionBlock = (NSData!, NSURLResponse!, NSError!) -> NSData
func requestURL(targetUrl: String, httpMethod: String, httpBody: String, completion: CompletionBlock){
// REQUEST
let target = NSURL(string: targetUrl) // URL
let request = NSMutableURLRequest(URL: target!) // REQUEST
// HTTP-METHOD
var method = httpMethod
if method != "POST" { method = "GET" } // STANDARD: GET
request.HTTPMethod = method
// HTTP-BODY
let body = httpBody
if body != "" {
request.HTTPBody = body.dataUsingEncoding(NSUTF8StringEncoding)
}
// NSURLSession
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request, completionHandler: completion) // Compiler error!
task.resume()
}
称呼:
requestURL(targetURL, "GET", "", { (responseData: NSData!, response: NSURLResponse!, error: NSError!) -> NSData in
if responseData != nil {
let resultString = NSString(data: responseData, encoding: NSUTF8StringEncoding) // NSASCIIStringEncoding
println("DATA:\n\(resultString)")
}
if error != nil {
println("ERROR:\n\(error)")
}
return responseData
})
我在第21行的func中收到一个错误:
let task = session.dataTaskWithRequest(request, completionHandler: completion)
编译器:“无法使用类型为((NSMutableURLRequest,completeHandler:completionBlock))的参数列表调用'dataTaskWithRequest'”
至于问题: typealias CompletionBlock = (NSData!, NSURLResponse!, NSError!) -> NSData
您的完成处理程序返回,NSData
但不应该像声明中那样返回任何内容:
func dataTaskWithRequest(_ request: NSURLRequest,
completionHandler completionHandler: ((NSData!,
NSURLResponse!,
NSError!) -> Void)?) -> NSURLSessionDataTask
因为您提供了错误,所以导致了类型错误closure type
。
这是非常合理的,因为它dataTaskWithRequest
被设计为异步的。它creates an HTTP request for the specified URL request object, and calls a handler upon completion
。如果您确实要发出同步请求,则可以使用带有的旧NSURLConnection
API sendSynchronousRequest
,但您不应这样做,因为同步请求是一个非常糟糕的设计选择:它们会阻塞主UI线程,除取消该请求外没有其他方法可以取消当它自己出错时。这就是为什么AppleNSURLSession
根据完成处理程序并现在在iOS 9中弃用了同步请求而创建了一个新API的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句