如何在其他视图中恢复数据下载?

时间:2014-02-15 16:06:26

标签: ios iphone nsurlconnection afnetworking nsoutputstream

我正在使用AFNetworking下载mp3文件。下载发生在特定的ViewController中。由于mp3文件非常大,完成下载需要几分钟。问题是,当我去另一个ViewController时,下载停止,我必须继续下载ViewController并等待下载完成。这对用户来说是令人沮丧的!即使下载ViewController被解除,有没有办法让下载进行? 这是我用于下载的代码:

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.sample.com/samplefile.mp3"]];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
NSString *mp3Name = @"sample.mp3";

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:mp3Name];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"Successfully downloaded file to %@", path);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

2 个答案:

答案 0 :(得分:0)

您可以创建单身

 +(id)sharedInstance
{
static dispatch_once_t pred;
static MyClass *sharedInstance = nil;
dispatch_once(&pred, ^{
    sharedInstance = [[MyClass alloc] init];
});
return sharedInstance;
}

并在其中实施下载操作。

如果您在阅读本文iOS design patterns

之前未使用单身人士

还阅读有关raywenderlich的这篇文章。它将让您了解如何正确组织Web服务工作

AFNetworking crash course

NSOperations

答案 1 :(得分:0)

实现您想要的最简单方法是在ApplicationDelegate中放入一个启动下载的方法,并在下载完成后通知您的视图控制器。所以只需将代码移到applicationDelegate即可。

请注意:我不认为这是最好的方法,在一个单独的类中处理网络流量要好得多,但最简单的方法是使用(已经建立的)Singleton,这是你的ApplicationDelegate。