gpt4 book ai didi

objective-c - 如何在网络出现故障时使用 MKNetworkKit 恢复下载

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:44:37 24 4
gpt4 key购买 nike

据称 MKNetworkKit 支持恢复中断的下载,但尚不清楚如何实现这一点。在另一个线程中,开发人员表示,如果服务器 发送 Range header ,它就可以工作。

How to cancel or pause download operation of MKNetworkKit iOS?

但是,据我了解,发送 Range header 的是客户端。我希望图书馆看到下载了多少,然后请求适当的范围。我在代码中没有看到执行此操作的任何地方。

方法

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

确实会检查是否已指定范围,但似乎没有实际执行指定的代码。

有没有人让 MKNetworkKit 在网络故障后恢复下载?

最佳答案

在 freezable 选项之外,据我所知,它不适用于 GET,标准 MKNetworkKit 中没有办法恢复下载。但是,稍作修改就可以让您恢复已被

停止的下载

beginBackgroundTaskWithExpirationHandler

或通过

operationFailedWithError

它需要将 downloadedDataSize 保存到另一个属性,比如 resumeDownloadedDataSize 并通过通知(例如

NSDictionary *resumeDownloadedDataSizeDetails = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithLong:self.resumeDownloadedDataSize], @"resumeDownloadedDataSize", nil];
[[NSNotificationCenter defaultCenter] postNotificationName:kMKNetworkOperationEndBackgroundTaskWithExpirationHandler object:self userInfo:resumeDownloadedDataSizeDetails];

(在 MkNetworkKit.h 中定义 kMKNetworkOperationEndBackgroundTaskWithExpirationHandler)

将 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) start

这段代码在

的开头
- (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;

添加到头文件,以便我可以从其他 View 设置它。

现在在你的调用对象中你可以监听通知

[[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)


}

最后一部分是确保在您的引擎中将附加设置为 YES

[op addDownloadStream:[NSOutputStream outputStreamToFileAtPath:filePath append:YES]];

因此简历会添加到文件中。

还需要说明的是,我使用的是 AWS CloudFront,它支持在 S3 中存储数据时使用范围 header 。

这似乎对我有用。我相信有更优雅的方法可以做到这一点。

关于objective-c - 如何在网络出现故障时使用 MKNetworkKit 恢复下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12341373/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com