gpt4 book ai didi

iphone - Objective-C 检查下载文件的大小

转载 作者:行者123 更新时间:2023-12-03 20:47:04 25 4
gpt4 key购买 nike

我正在创建一个从 S3 服务器下载 .zip 文件的应用程序。一切正常。现在我希望能够中断当前的下载。如果我可以保存文件的当前大小(字节),我将能够发送一个带有文件其他部分的范围 header 的新请求。

问题在于我无法确定“已”下载内容的大小,因为下载完成后我只能看到目录中的文件。因此,如果我中断,则不会保存部分文件。

此时我使用以下代码:

 -(void) downloadFile:(NSMutableArray*)paramArray withDict:(NSMutableDictionary*)options
{

NSLog(@"DOWNLOAD THREAD STARTED");
NSString * sourceUrl = [paramArray objectAtIndex:0];
NSString * fileName = [paramArray objectAtIndex:1];

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *newFilePath = [documentsDirectory stringByAppendingString:fileName];

NSError *error=[[[NSError alloc]init] autorelease];


NSURLConnection *fileURL = [NSData dataWithContentsOfURL: [NSURL URLWithString:sourceUrl]];

BOOL response = [fileURL writeToFile:newFilePath options:NSDataWritingFileProtectionNone error:&error];

if (response == TRUE)
{
NSLog(@"DOWNLOAD COMPLETED");
[self performSelectorOnMainThread:@selector(downloadComplete:withDict:) withObject:paramArray waitUntilDone:YES];
}
else
{
NSLog(@"Something went wrong while downloading file.");
NSString *callback = [NSString stringWithFormat:@"downloadInterrupted('%@');",fileName];
[webView stringByEvaluatingJavaScriptFromString:callback];

}

[pool drain];
}

AsiHTTP 不是一个选项,因为我使用的 PhoneGap 存在问题。

最佳答案

更好的主意是异步下载文件。这有几个优点:最重要的一个是您的用户界面保持响应能力。用户可以在下载和等待数据时继续使用您的应用程序。如果您正在下载的数据对于应用程序绝对必要,请显示某种加载指示器。

您可以通过

轻松启动异步下载
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:sourceUrl]];
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];

现在,如何获取 NSData 对象中的下载数据?您为 self 实现以下委托(delegate)方法:

-connection:didReceiveData:
-connection:didFailWithError:
-connectionDidFinishLoading:

这个想法是,每当一些数据通过您的连接进入或发生任何重要的其他事情(例如成功或失败)时,您都会收到通知。因此,您将声明一个临时 NSMutableData 对象作为实例变量(例如 downloadData)并写入它,直到下载完成。不要忘记初始化空对象并声明一个属性!

每当某种数据(即下载文件的一部分)到达时,就会调用

-connection:didReceiveData: 。因此,您要将其附加到临时对象中,如下所示:

-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[self.downloadData appendData:data];
}

下载完成(成功)后,将调用下一个委托(delegate)方法:

-(void) connectionDidFinishLoading:(NSURLConnection *)connection {
//do whatever you need to do with the data in self.downloadData
}

如果下载失败,则调用 -connection:didFailWithError:。然后,您可以保存临时对象、获取其大小并稍后恢复下载。 [self.downloadData length]; 获取对象中数据的大小(以字节为单位)。

关于iphone - Objective-C 检查下载文件的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5039406/

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