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

时间:2016-04-20 13:49:45

标签: ios json swift

我正在尝试使用完成处理程序将数据存储在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'

如何使用完成处理程序执行此操作?

2 个答案:

答案 0 :(得分:2)

请仔细阅读并了解jsonData尚未初始化的问题。

jsonData仅在您的代码中的异步块中初始化。要解决您的问题,请设置var jsonData = [String: String]()

等属性的默认值

答案 1 :(得分:1)

因为你没有初始化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完成执行后分配并调用您的完成处理程序