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

Ios 如何将来自dataTaskWithUrl的响应存储在其他变量中?,ios,json,swift,Ios,Json,Swift,我正在尝试使用完成处理程序来存储dataTaskWithUrl之外的数据,以便与其他方法一起使用 这是我的代码: import UIKit import XCPlayground XCPSetExecutionShouldContinueIndefinitely(true) let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration()) var jsonDat

我正在尝试使用完成处理程序来存储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()
导入UIKit
导入运动场
XCPSetExecutionShouldContinueIndefinitely(真)
let session=NSURLSession(配置:NSURLSessionConfiguration.defaultSessionConfiguration())
var-jsonData:NSDictionary
让urlString=“”
session.dataTaskWithURL(NSURL(字符串:urlString)!,completionHandler:{
(taskData、taskResponse、taskError)->中的Void
var jsonReadError:n错误?
var jsonResult=try!NSJSONSerialization.JSONObjectWithData(taskData!,选项:NSJSONReadingOptions.MutableContainers)as!NSDictionary
var resp=jsonResult[“response”]作为!字符串
变量数据:NSData=resp.dataUsingEncoding(NSUTF8StringEncoding)!
var jsonResultNested=try!NSJSONSerialization.JSONObjectWithData(数据,选项:NSJSONReadingOptions.MutableContainers)作为!NSArray
dispatch\u async(dispatch\u get\u main\u queue(){
jsonData=JSONResultTested[0]为!NSDictionary
})
})1.简历()
当我在外面打印
jsonData
时,它会说

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


如何使用完成处理程序实现这一点?

请仔细阅读,您会明白,
jsonData
尚未初始化的问题


jsonData
仅在代码的异步块中是init。为了解决您的问题,请为属性设置默认值,如
var jsonData=[String:String]()
请仔细阅读,您了解
jsonData
尚未初始化的问题


jsonData
仅在代码的异步块中是init。为解决此问题,请为属性设置默认值,如
var jsonData=[String:String]()

,因为您没有初始化
jsonData
,并且您的
dataTaskWithURL
是异步方法,您无法保证在访问完成处理程序外部的jsonData对象之前运行它

现在有两个选项,要么初始化它,要么保持它为可选,并在访问之前检查它是否为nil

选项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
完成执行后分配,并调用您的完成处理程序

这是因为您没有初始化
jsonData
,并且您的
dataTaskWithURL
是异步方法,您无法保证在访问完成处理程序外部的jsonData对象之前它会运行

现在有两个选项,要么初始化它,要么保持它为可选,并在访问之前检查它是否为nil

选项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
完成执行后分配,并调用您的完成处理程序

谢谢,但这样做并不是在
jsonData
中存储
jsonresultested[0]
的响应。这只是示例var jsonData=[String:String]()您需要使用正确的键值类型hanks初始化NSDictionary,但这样做并不是存储
jsonresultested[0]的响应
jsonData
中。这只是示例var jsonData=[String:String]()您需要使用正确的键值类型初始化NSDictionary