繁体   English   中英

从图片url下载图片方面,URLSession与GCD有何区别?

[英]What is difference between URLSession vs GCD in terms of download image from image url?

从图像url下载图像方面, URLSession vs DispatchQueue.global().async + Data(contentsOf: )有何区别?

func loadImageWithUrlSession() {
    guard let url = URL(string: IMAGE_URL) else { return }
    URLSession.shared.dataTask(with: url) { (data, response, error) in
        if let error = error {
            print(error.localizedDescription)
            return
        }
        guard let data = data else { return }
        let image = UIImage(data: data)
        DispatchQueue.main.async { [weak self] in
            guard let self = self else { return }
            self.urlSessionImageView.image = image
        }
    }.resume()
}

func loadImageWithGCD() {
    DispatchQueue.global(qos: .background).async {
        guard
            let url = URL(string: self.IMAGE_URL),
            let data = try? Data(contentsOf: url) else {
                return
        }
        let image = UIImage(data: data)

        DispatchQueue.main.async { [weak self] in
            guard let self = self else { return }
            self.gcdImageView.image = image
        }
    }
}

我知道URLSession可以取消或暂停任务。
但是,如果我改用Rx,我也可以做与上述相同的事情。

我做了一个实验,这取决于我使用的QoS。
顺便说一句,.userInitiated QoS比URLSession快得多。
你们使用哪一个来执行类似任务,例如通过后台线程下载任务,为什么?

请问有什么专门的老师可以帮助我吗?

URLSession提供了更好的配置控制,故障诊断,取消,后台会话,直接下载到永久性存储以最大程度地减少峰值内存使用量的能力等URLSessionData(contentsOf:)在功能集上是无法比拟的。

同步Data(contentsOf:)不必要地阻塞了GCD工作线程,并且也容易被滥用。 这也是非常有限的,将来您会很后悔自己的决定(例如,稍后添加一些身份验证过程;您要自定义缓存行为,要解析并根据响应中的状态代码采取行动,需要取消操作)功能,因为您正在检索图像以进行集合视图或表格视图等)。

看看其中一个带有Data的URL方法的init 的文档的说明很有启发性:

重要

不要使用此同步初始化程序来请求基于网络的URL。 对于基于网络的URL,此方法可能会在速度较慢的网络上将当前线程阻塞数十秒钟,从而导致较差的用户体验,并且在iOS中可能会导致您的应用终止。

相反,对于非文件URL,请考虑使用URLSession类的dataTask(with:completionHandler:)方法。 有关示例,请参见将网站数据提取到内存中。

是的,将其分配给后台线程可以解决上述许多问题,但Apple并不仅建议“仅将其分配给某些后台队列”,而是明确建议使用URLSession 尽管您使用GCD全局队列可以避免Apple在上面警告我们的一些问题,但它也施加了许多不必要的限制。 如果您使用Data(contentsOf:) ,那么这个决定您将来可能会后悔/重构。 URLSession立即使用URLSession


关于使用.userInitiated ,vs .defaultURLSession方法时Data(contentsOf:)明显更快,通常网络延迟和传输时间使所有与队列优先级相关的因素URLSession ,,因此我很难相信这一说法。 实际上,我刚刚通过GCD测试了50张图片的下载(同时使用.default.userInitiated ),并且速度与URLSession方法没有明显不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM