我尝试了两种技术来获取数据并从完成处理程序中填充数组。在这两种方法中,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中尝试过的方法。谢谢。

最佳答案

您在调用以异步方法填充数组后立即在viewDidLoad方法中查询该数组。

didFetchData()第二种方法检查结果。

override func viewDidLoad() {
    super.viewDidLoad()
    self.downloadTask()
}


func didFetchData(data:String) {
    self.dataArray.append(data)
    // Check the count here!!
    print(dataArray.count)
}


您将需要将协议更改为:

protocol MyDelegate{ func didFetchData(dataArray: [])}


然后为委托添加变量:

var mDelegate = MyDelegate?


然后分配结果:

func didFetchDataCompeleted(dataArray: []) {
    // hand over the data to the delegate
    mDelegate?.didFetchData(self.dataArray)
}


现在,在结束代码中完成innerTask时,将调用更改为

self.didFetchDataCompeleted(dataArray:self.dataArray)


或致电:

self.mDelegate?.didFetchData(self.dataArray)


innerTask完成后

关于ios - 在URLSession.shared.dataTask期间从异步关闭存储数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44206413/

10-10 23:12
查看更多