NSURLSession 响应字符串完成块 - Swift

Posted

技术标签:

【中文标题】NSURLSession 响应字符串完成块 - Swift【英文标题】:NSURLSession Response String completion block - Swift 【发布时间】:2015-07-15 16:06:44 【问题描述】:

我想在调用下一个函数“nextScreen()”(segue)之前等待 responseString 完成。目前我有一个 if 语句来确保它在继续之前不为零,但有时会调用下一个函数/segue,因为 responseString 仍在下载。

你能帮忙做一个完成块吗?我找到了 NSURLSession 的完成块,但这些只是等待初始 HTTP 调用完成,而不是响应字符串。

func getProfiles()
    func post(completion: (message: String?) -> Void) 
        let request = NSMutableURLRequest(URL: NSURL(string: "http://**.**.**.**/EPG/XML/QueryProfile")!)
        request.HTTPMethod = "POST"
        let postString = "<QueryProfileReq><type>1</type></QueryProfileReq>"
        request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)

        let task: Void = NSURLSession.sharedSession().dataTaskWithRequest(request,
            completionHandler: (data: NSData!,
                response: NSURLResponse!,
                error: NSError!) in
                if error != nil 
                    println("error=\(error)")
                    let alert = UIAlertView()
                    alert.delegate = self
                    alert.title = "Login Error"
                    alert.message = "\(error)"
                    alert.addButtonWithTitle("OK")
                    alert.show()
                    self.view.endEditing(true)
                    return
                
                if let responseString = NSString(data: data, encoding: NSUTF8StringEncoding) 
                    if response != nil 
                        println("got profiles")
                        self.nextScreen()
                    
                    self.dataVar = data // UPDATES VARIABLE TO SEND
                
        ).resume()

    

【问题讨论】:

How can I get the Data from NSURLSession.sharedSession().dataTaskWithRequest 的可能重复项 【参考方案1】:

dataTaskWithRequest 的便捷方法本质上是返回数据或错误,通常带有一些响应头类型信息。如果您有错误,那么您将没有数据(99% 对此有把握)。我已重新格式化您的方法以提供帮助。 NSString Init Convenience 方法是同步的,所以不太清楚您所说的等待完成而不是 http 调用是什么意思?

func getStringFromRequest(completionHandler:(success:Bool, data: NSData?) -> Void) 

    let request = NSMutableURLRequest(URL: NSURL(string: "http://##.##.##.##/EPG/XML/QueryProfile")!)
    request.HTTPMethod = "POST"
    let postString = "<QueryProfileReq><type>1</type></QueryProfileReq>"
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request)  (data, response, error) -> Void in

        if let unwrappedError = error 
            print("error=\(unwrappedError)")
        
        else 
            if let unwrappedData = data 
                completionHandler(success: true, data: unwrappedData)
                return
            
        

        completionHandler(success: false, data: nil)
    

    task?.resume()


func performPost() 

    getStringFromRequest  (success, data) -> Void in

        if (success) 

            if let unwrappedData = data 

                self.dataVar = unwrappedData

                if let responseString = NSString(data: unwrappedData, encoding: NSUTF8StringEncoding) 
                    self.nextScreen()
                
            
        
        else 
            print("Failed")
        
    

【讨论】:

我需要获取完整的响应字符串。然后我将数据复制到 NSData 变量。完成后,我需要转到屏幕并复制数据。这一切都需要按照这个顺序。大多数时候它都有效。但我需要确保按此顺序完成。 1. 完全收到响应字符串 2. 数据复制到变量 3. 转到新屏幕 嗨,我已经编辑了答案以建议如何处理这个 谢谢。虽然它不会带来任何错误。该应用程序现在只是挂在这部分。我已经放了一些 println 来看看什么在运行,什么没有。它开始 if let unwrappedData = data completionHandler(success: true, data: unwrappedData) 并在之后打印。但它不会更进一步。我也不确定现在在哪里调用 performPost?虽然我可能遗漏了一些明显的东西 你只需要调用performPost()。数据获取将成功与否,然后您可以决定如果成功该怎么办。我的意思只是为了演示一种方法,您可以将代码拆分为功能块,以便清楚起见并展示 completionHandler 的工作方式。 太好了,谢谢。我认为我的代码可以正常工作(尽管不如你的),但是五分之一的服务器必须退出。我只是要为此做一些事情。感谢您的帮助!

以上是关于NSURLSession 响应字符串完成块 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

如何在移动到下一行代码之前完成 NSURLSession 请求

基于 NSURLSession 的网络模式

NSURLSession 完成处理程序非常慢

iOS NSURLSession 使用自定义委托处理数据任务的完成

NSURLSession 啥时候运行?

未调用 NSURLSessionDataTask 完成处理程序块