如何将来自 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
通过上述操作将消除编译器错误,但在这两种情况下,您都会发现它没有任何数据(empty
或nil
),因为数据将在dataTaskWithURL
完成执行后分配并调用您的完成处理程序。
【讨论】:
以上是关于如何将来自 dataTaskWithUrl 的响应存储在其他变量中?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 datataskwithurl 的数据对象正在接收 null?
为啥 NSURLSession dataTaskWithURL 比 NSData dataWithContentsOfURL 慢得多?
iOS 9(Swift 2.0):无法使用类型为“(NSURL,(_,_,_)throws-> Void)”的参数列表调用“dataTaskwithURL”