swift如何在另一个变量中存储从 dataTaskWithUrl 的反应?

标签: json ios Swift
发布时间: 2017/3/5 23:24:50
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我试图完成处理程序用于存储以外 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 ,和你 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 完成执行并调用处理程序完成。

赞助商