gpt4 book ai didi

Swift:阻塞 mainThread 直到函数用 completionHandler 完成加载数据/NSURLSession

转载 作者:行者123 更新时间:2023-11-28 09:45:56 26 4
gpt4 key购买 nike

我想创建一个从 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, completionHandler: completionBlock)’类型的参数列表调用‘dataTaskWithRequest’”

最佳答案

至于问题问题:typealias CompletionBlock = (NSData!, NSURLResponse!, NSError!) -> NSData

您的完成处理程序返回 NSData 但它不应像声明中那样返回任何内容:

func dataTaskWithRequest(_ request: NSURLRequest,
completionHandler completionHandler: ((NSData!,
NSURLResponse!,
NSError!) -> Void)?) -> NSURLSessionDataTask

这导致了类型错误,因为您提供了错误的闭包类型

而且这是相当合理的,因为dataTaskWithRequest被设计成异步。它为指定的 URL 请求对象创建 HTTP 请求,并在完成时调用处理程序。如果您真的想要发出同步请求,您可以使用带有sendSynchronousRequest 的旧NSURLConnection API,但您不应该 这样做,因为同步请求是一个非常糟糕的设计选择:它们会阻塞主 UI 线程并且没有办法取消该请求,除非它自己出错。这就是为什么 Apple 基于完成处理程序创建了一个新的 NSURLSession API,现在在 iOS 9 中弃用同步请求。

关于Swift:阻塞 mainThread 直到函数用 completionHandler 完成加载数据/NSURLSession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32200380/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com