我正在尝试使用完成处理程序将数据存储在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'
如何使用完成处理程序执行此操作?
答案 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
}
通过执行上述操作将删除编译器错误,但在这两种情况下,您都会发现它没有任何数据(empty
或nil
),因为数据将在dataTaskWithURL
完成执行后分配并调用您的完成处理程序