如何将来自 dataTaskWithUrl 的响应存储在其他变量中?

Posted

技术标签:

【中文标题】如何将来自 dataTaskWithUrl 的响应存储在其他变量中?【英文标题】:How to store response from dataTaskWithUrl in other variable? 【发布时间】:2016-04-20 13:49:45 【问题描述】:

我正在尝试使用完成处理程序将数据存储在 dataTaskWithUrl 之外以与其他方法一起使用。

这是我的代码:

import UIKit
import XCPlayground

XCPSetExecutionShouldContinueIndefinitely(true)

let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
var jsonData : NSDictionary
let urlString = "<my_rest_api>"
session.dataTaskWithURL(NSURL(string: urlString)!, completionHandler: 
    (taskData, taskResponse, taskError) -> Void in
    var jsonReadError: NSError?
    var jsonResult = try! NSJSONSerialization.JSONObjectWithData(taskData!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary

    var resp=jsonResult["response"] as! String
    var data: NSData = resp.dataUsingEncoding(NSUTF8StringEncoding)!
    var jsonResultNested = try! NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as! NSArray
    dispatch_async(dispatch_get_main_queue(), 
        jsonData = jsonResultNested[0] as! NSDictionary
    )

).resume()

当我在外面打印jsonData 时,它说

错误:变量“jsonData”在初始化之前使用

如何使用完成处理程序做到这一点?

【问题讨论】:

【参考方案1】:

仔细阅读,你就明白jsonData还没有初始化的问题。

jsonData 仅在您的代码中的异步块中初始化。为了解决您的问题,请为var jsonData = [String: String]()等属性设置默认值

【讨论】:

谢谢,但这样做不会将jsonResultNested[0] 的响应存储在jsonData 中。 这只是示例 var jsonData = [String: String]() 您需要使用正确的键值类型初始化 NSDictionary【参考方案2】:

这是因为你没有初始化jsonData,而你的dataTaskWithURL是异步方法,你不能保证它会在你访问完成处理程序之外的jsonData对象之前运行。

现在有两个选项,要么初始化它,要么让它保持可选状态,并在访问之前检查它是否不为零。

选项 1。 在开始时对其进行初始化。

 var jsonData : NSDictionary = NSDictionary()

选项2。标记是可选的,使用前检查它是否有价值

var jsonData : NSDictionary?
.
.
.
and where you are accessing it outside the block do this
if let dictionary = jsonData 
    // inside this access your jsonData

通过上述操作将消除编译器错误,但在这两种情况下,您都会发现它没有任何数据(emptynil),因为数据将在dataTaskWithURL 完成执行后分配并调用您的完成处理程序。

【讨论】:

以上是关于如何将来自 dataTaskWithUrl 的响应存储在其他变量中?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 datataskwithurl 的数据对象正在接收 null?

为啥 NSURLSession dataTaskWithURL 比 NSData dataWithContentsOfURL 慢得多?

iOS 9(Swift 2.0):无法使用类型为“(NSURL,(_,_,_)throws-> Void)”的参数列表调用“dataTaskwithURL”

如何将自定义响应标头添加到来自 azure blob 的响应?

您如何将来自 PayPal 的 PDT 响应转换为哈希?

如何将 map() 与来自 axios 响应的数据一起使用?