Swift:阻塞mainThread,直到函数完成数据加载,并使用完成处理程序NSURLSession

ixany

我想创建一个从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'”

奥列克桑德·卡拉贝罗夫(Oleksandr Karaberov)

至于问题: 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如果您确实要发出同步请求,则可以使用带有的旧NSURLConnectionAPI sendSynchronousRequest,但您不应这样做,因为同步请求是一个非常糟糕的设计选择:它们会阻塞主UI线程,除取消该请求外没有其他方法可以取消当它自己出错时。这就是为什么AppleNSURLSession根据完成处理程序并现在在iOS 9中弃用了同步请求创建了一个新API的原因

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Swift中使用完成处理程序创建函数?

如何在iOS Swift中使用完成处理程序正确记录方法

如何使用完成处理程序正确消除模式ViewController

Swift:使用完成处理程序从另一个通知一个ViewController

如何在Fire Base中使用完成处理程序

使用完成处理程序(关闭)语法从objective-c文件中的swift文件中调用函数

使用完成处理程序按顺序执行操作

函数完成处理程序Swift 4

如何等待直到lambda函数完成对SQS队列的处理?

在while循环中使用完成处理程序

使用完成处理程序在Swift中调用连续动画

Swift-从第二个函数调用完成处理程序

使用完成处理程序和DispatchSemaphore在Swift上进行异步请求

如何在SKSpriteNode上的Swift中使用完成处理程序进行连续的函数调用?

在目标C中使用完成处理程序调用Swift函数

等待ajax函数完成,直到使用间隔再次重新加载该函数

Swift 3-未调用完成处理程序

使用完成处理程序来处理对Firebase的调用的结果

使用 SQL 函数完成语句前最大递归 100 已用完

jQuery 等待直到函数完成

我的完成处理程序完成后仍然无法重新加载 tableView 数据 swift 4

在 Swift 中,如何在已经使用 One 的函数中使用完成处理程序?

调用完成处理程序 Firebase Swift

Swift 4 tableview 未使用通用完成处理程序显示数据

如何使用完成处理程序和参数调用函数

使用完成处理程序调用自己的函数

使用完成处理程序创建 Firebase 登录功能

使用“Result”调用完成处理函数

Tkinter gui 冻结,直到函数完成