【发布时间】:2017-05-26 16:41:24
【问题描述】:
我尝试了两种技术来从完成处理程序中获取数据并填充数组。在这两种方法中,dataArray 计数都显示为 0。而我可以放置断点并看到在闭包内执行时正在填充数组:
尝试的第一种方法:
在下面的代码中,dataArray 显示计数为零,即使它在内部和外部完成处理程序执行期间填充 dataArray。
class ViewController: UIViewController {
var dataArray = []
var urlOuter = URL(string: "outer.url.com/json")
override func viewDidLoad() {
super.viewDidLoad()
self.downloadTask()
print(dataArray.count)
}
func downloadTask() {
let outerTask = URLSession.shared.dataTask(with: urlOuter!, completionHandler: {
(data, response, error) in
let parsedData = try JSONSerialization.jsonObject(with: content, options: .mutableContainers) as! [[String: Any]]
for arr in parsedData! {
var urlInner = URL(string: "http://inner.url/" + arr["url"] + ".com/json")
let innerTask = URLSession.shared.dataTask(with: urlInner!, completionHandler: {
(data, response, error) in
let innerParsedData = try JSONSerialization.jsonObject(with: content, options: .mutableContainers) as! [[String: Any]]
self.dataArray.append(innerParsedData)
})
innerTask.resume()
}// end of for loop
})
outerTask.resume()
}
}
尝试了第二种方法:
protocol MyDelegate{ func didFetchData(data:String)}
class ViewController: UIViewController {
var dataArray = []
var urlOuter = URL(string: "outer.url.com/json")
override func viewDidLoad() {
super.viewDidLoad()
self.downloadTask()
print(dataArray.count)
}
func didFetchData(data:String) {
self.dataArray.append(data)
}
func downloadTask() {
let outerTask = URLSession.shared.dataTask(with: urlOuter!, completionHandler: {
(data, response, error) in
let parsedData = try JSONSerialization.jsonObject(with: content, options: .mutableContainers) as! [[String: Any]]
for arr in parsedData! {
var urlInner = URL(string: "http://inner.url/" + arr["url"] + ".com/json")
let innerTask = URLSession.shared.dataTask(with: urlInner!, completionHandler: {
(data, response, error) in
let innerParsedData = try JSONSerialization.jsonObject(with: content, options: .mutableContainers) as! String
self. didFetchData(data:innerParsedData)
})
innerTask.resume()
}// end of for loop
})
outerTask.resume()
}}}
请帮助我了解如何从闭包中获取数据并将它们存储在数组中。建议的其他解决方案是使用委托,这就是我在方法 2 中尝试的方法。谢谢。
【问题讨论】:
-
我没有遵循所有的代码,但很有可能您将数据正确放入数组中。问题是您试图过早地打印计数。在
append之后立即打印您的结果。 -
谢谢@PhillipMills,当我在追加后调用 count 时,dataArray 正在递增。但是我需要在其他地方使用这些数据并且需要它是持久的。从外部访问此数组时,它显示为一个空数组。
标签: ios swift swift3 closures completionhandler