适用于iOS的Fire and forget URL下载

时间:2014-08-27 17:52:32

标签: ios networking reachability nsurlsession

问题

我目前正在使用[NSData dataWithContentsOfURL: url]获取天气预报信息。这样做的问题是,如果在URL提取过程中出现错误,我只能回到零。

方法[NSData dataWithContentsOfURL:options:error:]的替代方法将向我提供错误信息,但我的调用函数需要的是数据,而不是它必须诊断和处理的可能错误。< / p>

要求

我想要的是一个单一功能,客户可以调用该功能来抓取“绝对不会停止”的网址,直到加载网址为止。

我不希望函数的客户需要考虑:

  • 超时。
  • 互联网连接不可用。
  • 设备被锁定或应用程序移至后台。
  • 有问题的实际网站已关闭。
  • 其他错误来源。

其他设计目标

  • 该功能应该很好地处理设备和远程站点 - 例如,它不应该使用重新发送肯定会失败的请求进行淹没。

  • 来电者应该可以根据需要中止尝试,所以它会想要拥有一个请求句柄,允许它将其终止。

    < / LI>
  • 该函数应该是异步,在最终到达时使用一个块来处理结果。

  • 对于额外标记,要发送调用函数的方法错误诊断会很好。同样,我认为一个块可以很好地为此工作。不需要关于错误的任何事情,因为该函数不会放弃,但它可以使用它来为用户提供有用的反馈。例如,减轻他们的顾虑,或促使他们采取补救措施(例如,重新打开网络)。

可能的界面

所以客户端对函数的调用可能是这样的:

_currentGrabber = [TenaciousURLGrabber 
  grabberForURL: myURL
  withCompletionAndDiagnosticsHandler: 
    ^(NSData* finalData, ErrorObject *error){
      if(data)
      {
        // Update my UI using data.
      }
      else
      {
        // Update my UI to show `[error localisedError];`
      }
    }];

如果客户端感到无聊或者认为抓取不再值得,那么可以这样做:

[_currentGrabber invalidate];

实施思路。

如果这已经存在,那就太好了。否则,我对实现此功能的建议感兴趣。

我应该使用NSURLSession而不是旧的NSURLConnection。后台(进程外)下载的可能性看起来有用吗?超出此范围的任何提示?

该函数应使用SCNetworkReachability,如Reachability sample application中所示,无法确定何时值得重试。

0 个答案:

没有答案