在 URLSession.shared.dataTask 期间存储来自异步闭包的数据

只要

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在URLSession.shared.dataTask之后调用performSegue

来自分类常见问题

URLSession.shared.dataTask与dataTaskPublisher,什么时候使用?

来自分类Dev

JSON网络请求未输入URLSession.shared.dataTask

来自分类Dev

URLSession.shared.dataTask与dataTaskPublisher,什么时候使用?

来自分类Dev

何时对URLSession.shared.dataTask使用弱自身

来自分类Dev

Swift URLSession.shared.dataTask GET 请求 -1001 返回超时

来自分类Dev

appleTV: URLSession.shared.dataTask 下载为空

来自分类Dev

URLSession.dataTask 返回 0 的数据

来自分类Dev

来自 HTTPS URLSession.dataTask 的 0 字节数据

来自分类Dev

如果在页面完成之前退出页面,如何取消URLSession.shared.dataTask?

来自分类Dev

如何获取请求中标头的值 (URLSession.shared.dataTask(with: request) { (data, response, error)

来自分类Dev

URLSession dataTask 返回没有错误也没有数据,导致 SwiftyStoreKit.ReceiptError 错误 1

来自分类Dev

URLSession dataTask - 错误检查 - 无法通过 '!' 分配:'err' 是一个 'let' 常量

来自分类Dev

将变量传递给 dataTask 异步函数

来自分类Dev

使用URLSession从服务器获取数据

来自分类Dev

从URLSession数据向MKMapView添加注释

来自分类Dev

调用urlsession数据后重新加载映射

来自分类Dev

Swift - 来自 URLSession 任务的 TableView 数据源

来自分类Dev

在Swift中下载NSURLSession期间未调用URLSession委托

来自分类Dev

斯威夫特:如何在异步urlsession函数中返回值?

来自分类Dev

URLSession 响应不包含来自上次重定向的标头

来自分类Dev

URLSession没有返回位置数据(会话:downloadTask:didFinishDownloadingToURL位置)

来自分类Dev

tableview为空,但我看到游乐场中的数据来自urlsession

来自分类Dev

需要帮助运行基于来自 URLSession (Swift3) 的数据的动画

来自分类Dev

Flutter,什么是_shared包?

来自分类Dev

Flutter shared_preferences不存储数据

来自分类Dev

使用URLSession提取数据时“不允许从后台线程发布更改”

来自分类Dev

如果不使用第三方库,URLSession是否需要获取远程数据?

来自分类Dev

Swift 4:使用 URLSession 解析为泛型类型的数据任务需要实现 Encodable

Related 相关文章

  1. 1

    在URLSession.shared.dataTask之后调用performSegue

  2. 2

    URLSession.shared.dataTask与dataTaskPublisher,什么时候使用?

  3. 3

    JSON网络请求未输入URLSession.shared.dataTask

  4. 4

    URLSession.shared.dataTask与dataTaskPublisher,什么时候使用?

  5. 5

    何时对URLSession.shared.dataTask使用弱自身

  6. 6

    Swift URLSession.shared.dataTask GET 请求 -1001 返回超时

  7. 7

    appleTV: URLSession.shared.dataTask 下载为空

  8. 8

    URLSession.dataTask 返回 0 的数据

  9. 9

    来自 HTTPS URLSession.dataTask 的 0 字节数据

  10. 10

    如果在页面完成之前退出页面,如何取消URLSession.shared.dataTask?

  11. 11

    如何获取请求中标头的值 (URLSession.shared.dataTask(with: request) { (data, response, error)

  12. 12

    URLSession dataTask 返回没有错误也没有数据,导致 SwiftyStoreKit.ReceiptError 错误 1

  13. 13

    URLSession dataTask - 错误检查 - 无法通过 '!' 分配:'err' 是一个 'let' 常量

  14. 14

    将变量传递给 dataTask 异步函数

  15. 15

    使用URLSession从服务器获取数据

  16. 16

    从URLSession数据向MKMapView添加注释

  17. 17

    调用urlsession数据后重新加载映射

  18. 18

    Swift - 来自 URLSession 任务的 TableView 数据源

  19. 19

    在Swift中下载NSURLSession期间未调用URLSession委托

  20. 20

    斯威夫特:如何在异步urlsession函数中返回值?

  21. 21

    URLSession 响应不包含来自上次重定向的标头

  22. 22

    URLSession没有返回位置数据(会话:downloadTask:didFinishDownloadingToURL位置)

  23. 23

    tableview为空,但我看到游乐场中的数据来自urlsession

  24. 24

    需要帮助运行基于来自 URLSession (Swift3) 的数据的动画

  25. 25

    Flutter,什么是_shared包?

  26. 26

    Flutter shared_preferences不存储数据

  27. 27

    使用URLSession提取数据时“不允许从后台线程发布更改”

  28. 28

    如果不使用第三方库,URLSession是否需要获取远程数据?

  29. 29

    Swift 4:使用 URLSession 解析为泛型类型的数据任务需要实现 Encodable

热门标签

归档