【发布时间】:2017-06-09 13:43:41
【问题描述】:
我从 url 获取 json 文件,然后,所有 json 输出将被添加到一个数组中。当我打印数组时,它说数组是空的,但实际上我知道数组不是空的。如果我使用like:DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { },那么,我可以打印数组。
我获取 json 并将其值添加到数组的代码:
var allTags:Array<String> = []
func getJSON(getUrl:URL){
let url:URL = getUrl
let session = URLSession.shared
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData
let task = session.dataTask(with: request as URLRequest) {
(data, response, error) in
let dataString = String(data: data, encoding: String.Encoding.utf8)!
do {
let data = Data(dataString.utf8)
let dictionaries = (try? JSONSerialization.jsonObject(with: data)) as? [[String:Any]] ?? []
for dict in dictionaries {
let tags = dict["Tags"] as? [String] ?? []
for tag in tags {
allTags.append(tag)
}
}
}
}task.resume()
}
getJSON(getUrl: self.jsonUrl())
print(self.allTags.count) //it prints 0, but there are some data I know
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
print(self.allTags.count) //it prints 168
}
【问题讨论】:
-
尝试使用回调
-
我该怎么做?我已经阅读了stackoverflow中的回调,但是,我无法将它实现到我的代码中...... @Rishi
-
刚刚添加的答案
-
如果需要参数,使用
(parameter1: Type1, parameter2: Type2) -> Void -
这是因为你的 session.dataTask 是异步的。这意味着它在后台线程中运行,而它下面的代码正常执行。
print(self.allTags.count)不起作用的原因是它在从 URL 检索到任何数据之前执行。而asyncAfter调用在半秒后执行,这对于检索数据来说已经足够长了。
标签: arrays json swift asynchronous swift3