【问题标题】:Can async image download have timeout or do I need NSURLSession?异步图像下载可以超时还是我需要 NSURLSession?
【发布时间】:2017-12-26 14:20:27
【问题描述】:

这种图片下载技术能否使用超时:Why doesn't image load on main thread?

或者如果我想使用超时,我必须使用 NSURLSession 吗?

【问题讨论】:

    标签: swift nsurlsession swift4


    【解决方案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 个超时:timeoutIntervalForResourcetimeoutIntervalForRequest

    • ...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 代码。我为你复制了一个这样的例子。你应该可以从这里解决它。
      猜你喜欢
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多