我目前正在使用[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中所示,无法确定何时值得重试。