异步图像下载可以超时还是我需要 NSURLSession?
Posted
技术标签:
【中文标题】异步图像下载可以超时还是我需要 NSURLSession?【英文标题】:Can async image download have timeout or do I need NSURLSession? 【发布时间】:2017-12-26 14:20:27 【问题描述】:这种图片下载技术能否使用超时:Why doesn't image load on main thread??
或者如果我想使用超时,我必须使用 NSURLSession 吗?
【问题讨论】:
【参考方案1】:您正在寻找timeoutintervalForResource
属性。如果使用URLSession.shared
,则默认超时为 7 天。如果您想使用不同的超时时间,您需要创建自己的会话:
let config = URLSessionConfiguration.default
config.timeoutIntervalForResource = 60 // timeout, in seconds
// A 20 MB image from NASA
let url = URL(string: "https://www.nasa.gov/sites/default/files/thumbnails/image/hs-2015-02-a-hires_jpg.jpg")!
let session = URLSession(configuration: config)
session.dataTask(with: url) data, response, error in
if let error = error
print(error)
// do something
.resume()
足够低的超时,你会看到一个超时错误。请注意,URLSessionConfiguration
有 2 个超时:timeoutIntervalForResource
和 timeoutIntervalForRequest
:
...Resource
是等待全网运行完成的时间(默认为7天)
...Request
是等待下一个数据块到达的时间(默认为 60 秒)
如果您的目标是在 x 分钟内下载某些内容,请使用 ...Resource
。如果您的目标是“网络必须在 x 秒内做出响应,否则会出现故障”,请使用 ...Request
。
【讨论】:
【参考方案2】:不,您不必使用 NSURLSession。超时属性在 URLSesssionConfiguration 中,您只需要使用所需的配置创建 URLSession 的实例。
因此,您需要创建自己的 URLSession 实例并从该实例启动 dataTask
,而不是直接使用 URLSession.shared
。
您可能对 timeoutIntervalForResource 感兴趣,我认为它默认为 7 天。
这是来自question 答案的相关 Swift 片段:
let sessionConfig = URLSessionConfiguration.default
sessionConfig.timeoutIntervalForRequest = 30.0
sessionConfig.timeoutIntervalForResource = 60.0
let session = URLSession(configuration: sessionConfig)
【讨论】:
您是否有一个示例链接,将其用作实例而不是共享? 在 SO 和其他来源中有几个示例显示了具有非标准配置的 URL 会话的 Swift3/4 代码。我为你复制了一个这样的例子。你应该可以从这里解决它。以上是关于异步图像下载可以超时还是我需要 NSURLSession?的主要内容,如果未能解决你的问题,请参考以下文章