Objective c 如何在网络出现故障时使用MKNetworkKit恢复下载
据称,MKNetworkKit支持恢复中断的下载,但目前尚不清楚该如何处理。在另一个线程中,它的开发人员说,如果服务器发送范围头,它就可以工作 但是,据我所知,发送范围头的是客户机。我希望库看到下载了多少,然后请求适当的范围。我看不到代码中有任何地方可以这样做 方法Objective c 如何在网络出现故障时使用MKNetworkKit恢复下载,objective-c,ios,mknetworkkit,Objective C,Ios,Mknetworkkit,据称,MKNetworkKit支持恢复中断的下载,但目前尚不清楚该如何处理。在另一个线程中,它的开发人员说,如果服务器发送范围头,它就可以工作 但是,据我所知,发送范围头的是客户机。我希望库看到下载了多少,然后请求适当的范围。我看不到代码中有任何地方可以这样做 方法 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 确实检查是否指定了范围,但似乎没有代码实际执行指定 有人让MKNe
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
确实检查是否指定了范围,但似乎没有代码实际执行指定
有人让MKNetworkKit在网络故障后恢复下载吗?除了freezable选项(据我所知,该选项不适用于GET)之外,标准MKNetworkKit中没有恢复下载的方法。但是,稍微修改一下,您就可以恢复已被停止的下载 beginBackgroundTaskWithExpirationHandler 或者 操作失败 它需要将downloadedDataSize保存到另一个属性(如resumeDownloadedDataSize),并通过通知(如
NSDictionary *resumeDownloadedDataSizeDetails = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithLong:self.resumeDownloadedDataSize], @"resumeDownloadedDataSize", nil];
[[NSNotificationCenter defaultCenter] postNotificationName:kMKNetworkOperationEndBackgroundTaskWithExpirationHandler object:self userInfo:resumeDownloadedDataSizeDetails];
(在MkNetworkKit.h中使用ExpirationHandler定义KMKNetworkOperationAndBackgroundTask)
将resumeDownloadedDataSize设置为0,操作将在没有错误或中断的情况下完成,并在要继续时使其等于downloadDataSize
然后加上
if (self.resumeDownloadedDataSize !=0) {
NSString* range = @"bytes=";
range = [range stringByAppendingString:[[NSNumber numberWithLong:self.resumeDownloadedDataSize] stringValue]];
range = [range stringByAppendingString:@"-"];
[[self request] setValue:range forHTTPHeaderField:@"Range"];
}
到
此代码位于
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
if (self.downloadedDataSize == 0) {
// This is the first batch of data
// Check for a range header and make changes as neccesary
NSString *rangeString = [[self request] valueForHTTPHeaderField:@"Range"];
if ([rangeString hasPrefix:@"bytes="] && [rangeString hasSuffix:@"-"]) {
NSString *bytesText = [rangeString substringWithRange:NSMakeRange(6, [rangeString length] - 7)];
self.startPosition = [bytesText integerValue];
self.downloadedDataSize = self.startPosition;
}
}
现在适用于我添加的偏移量,因为客户端请求了一个范围
我还补充说
@property (assign, nonatomic) NSUInteger resumeDownloadedDataSize;
添加到头文件,以便从其他视图进行设置
现在,在调用对象中,您可以侦听通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didMKNetworkOperationEndBackgroundTaskWithExpirationHandler:) name:kMKNetworkOperationEndBackgroundTaskWithExpirationHandler object:nil];
检查是否适合您,然后重新启动设置范围的操作
- (void) didMKNetworkOperationEndBackgroundTaskWithExpirationHandler: (NSNotification*) notification
{
if ([[notification object] isEqual:downloadOperation]) {
resumeDownloadedDataSize = [notification.userInfo objectForKey:@"resumeDownloadedDataSize"];
bDownloadOperationCancelled=YES;
}
}
当我使用它下载大文件时,过期处理程序将过期,当我回到前台时,我将重新启动操作
if (bDownloadOperationCancelled) {
NSLogDebug(@"DownloadOperationCancelled restarted");
[self doFileDownload];
bDownloadOperationCancelled=NO;
}
在哪里
- (void) doFileDownload
{
downloadOperation = [ApplicationDelegate.downloadEngine downloadVideoFile:authDownloadURLString toFile:downloadPath withOffset:resumeDownloadedDataSize];
(Your code for handling completion blocks etc)
…
}
最后一点是确保在引擎中设置“附加到是”
[op addDownloadStream:[NSOutputStream outputStreamToFileAtPath:filePath append:YES]];
因此,简历会添加到文件中
还需要说明的是,我使用的是AWS CloudFront,当数据存储在S3中时,它支持使用范围头
这似乎对我有用。我相信还有更优雅的方式 只是更新我自己的答案。随后,我发现这显示了如何检查服务器是否能够遵守HTTP范围标头。
[op addDownloadStream:[NSOutputStream outputStreamToFileAtPath:filePath append:YES]];