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

艾莉

我最近遇到了两个对我来说似乎执行相同操作的数据获取(下载)API。我看不到何时应该使用另一种。

我可以用 URLSession.shared.dataTask

    var tasks: [URLSessionDataTask] = []

    func loadItems(tuple : (name : String, imageURL : URL)) {
        let task = URLSession.shared.dataTask(with: tuple.imageURL, completionHandler :
        { data, response, error in
            guard let data = data, error == nil else { return }
            DispatchQueue.main.async() { [weak self] in
                self?.displayFlag(data: data, title: tuple.name)
            }
        })
        tasks.append(task)
        task.resume()
    }

    deinit {
        tasks.forEach {
            $0.cancel()
        }
    }

或者我可以使用 URLSession.shared.dataTaskPublisher

    var cancellables: [AnyCancellable] = []

    func loadItems(tuple : (name : String, imageURL : URL)) {
        URLSession.shared.dataTaskPublisher(for: tuple.imageURL)
            .sink(
                receiveCompletion: {
                    completion in
                    switch completion {
                    case .finished:
                        break
                    case .failure( _):
                        return
                    }},
                receiveValue: { data, _ in DispatchQueue.main.async { [weak self] in self?.displayFlag(data: data, title: tuple.name) } })
            .store(in: &cancellables)
    }

    deinit {
        cancellables.forEach {
            $0.cancel()
        }
    }

我看不到它们的明显区别,因为两者都可以获取,并且都为我们提供了轻松取消任务的能力。有人可以阐明他们在何时使用哪种方面的差异吗?

Eimantas

第一个是经典。它已经存在了很长一段时间,并且大多数(如果不是所有)开发人员都熟悉它。

第二个是第一个的包装,并允许将其与其他发布者合并(例如,仅在执行前两个请求时才执行某个请求)。使用第一种方法组合数据任务将更加困难。

因此,要点:将第一个请求用于一次性请求。如果需要更多逻辑来将结果与其他发布者合并/传递给其他发布者(不仅来自URLSession),请使用第二个。基本上,这就是Combine框架背后的想法-您可以组合不同方式的异步机制(利用回调的数据任务就是其中之一)。

可以在去年的WWDC视频中找到更多信息,介绍结合收割机。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

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

来自分类Dev

在URLSession.shared.dataTask之后调用performSegue

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

appleTV: URLSession.shared.dataTask 下载为空

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何使用UrlSession.DataTaskPublisher调用发布Web服务?

来自分类Dev

什么时候应该优先使用Spock的@Shared注释而不是静态字段?

来自分类Dev

从“ URLSession.dataTaskPublisher”接收任务进度

来自分类Dev

std :: shared_ptr什么时候释放其对象?

来自分类Dev

URLSession.dataTask 返回 0 的数据

来自分类Dev

为什么 URLSession 没有进入 URLSessionDownloadDelegate?

来自分类Dev

将URLSession.DataTaskPublisher转换为Future发布者

来自分类Dev

如何检查URLSession.dataTaskPublisher的当前进度?

来自分类Dev

使用 URLSession 在 ios 中使用 POST API

来自分类Dev

使用URLSession从服务器获取数据

来自分类Dev

使用RxSwift和URLSession处理401状态

来自分类Dev

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

来自分类Dev

实现func urlSession(_ session:URLSession,didReceive挑战:URLAuthenticationChallenge之间有什么区别

来自分类Dev

为什么URLSession无法在iOS 10上恢复?

来自分类Dev

使用Swift URLSession将标头传递给URL

来自分类Dev

URLSession:使用http / 1.1代替http / 2

来自分类Dev

使用URLSession和Combine处理HTTP状态代码

来自分类Dev

为使用URLSession和RxSwift的函数编写单元测试

来自分类Dev

我可以在带有return的函数中使用URLSession吗?

来自分类Dev

如何在 swift3 XMLParse 中使用 urlsession

Related 相关文章

  1. 1

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

  2. 2

    在URLSession.shared.dataTask之后调用performSegue

  3. 3

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

  4. 4

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

  5. 5

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

  6. 6

    appleTV: URLSession.shared.dataTask 下载为空

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

    如何使用UrlSession.DataTaskPublisher调用发布Web服务?

  11. 11

    什么时候应该优先使用Spock的@Shared注释而不是静态字段?

  12. 12

    从“ URLSession.dataTaskPublisher”接收任务进度

  13. 13

    std :: shared_ptr什么时候释放其对象?

  14. 14

    URLSession.dataTask 返回 0 的数据

  15. 15

    为什么 URLSession 没有进入 URLSessionDownloadDelegate?

  16. 16

    将URLSession.DataTaskPublisher转换为Future发布者

  17. 17

    如何检查URLSession.dataTaskPublisher的当前进度?

  18. 18

    使用 URLSession 在 ios 中使用 POST API

  19. 19

    使用URLSession从服务器获取数据

  20. 20

    使用RxSwift和URLSession处理401状态

  21. 21

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

  22. 22

    实现func urlSession(_ session:URLSession,didReceive挑战:URLAuthenticationChallenge之间有什么区别

  23. 23

    为什么URLSession无法在iOS 10上恢复?

  24. 24

    使用Swift URLSession将标头传递给URL

  25. 25

    URLSession:使用http / 1.1代替http / 2

  26. 26

    使用URLSession和Combine处理HTTP状态代码

  27. 27

    为使用URLSession和RxSwift的函数编写单元测试

  28. 28

    我可以在带有return的函数中使用URLSession吗?

  29. 29

    如何在 swift3 XMLParse 中使用 urlsession

热门标签

归档