如何在其他视图中恢复数据下载?
Posted
技术标签:
【中文标题】如何在其他视图中恢复数据下载?【英文标题】:How to resume data download in other views? 【发布时间】:2014-02-15 16:06:26 【问题描述】:我正在使用 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);
];
【问题讨论】:
【参考方案1】:实现您想要的最简单的方法是在 ApplicationDelegate 中放置一个方法,该方法开始下载并在下载完成后通知您的视图控制器。因此,只需将您的代码移动到 applicationDelegate。
请注意:我认为这不是最好的方法,最好在一个单独的类中处理网络流量,但最简单的方法是使用(已经建立的)单例应用程序委托。
【讨论】:
【参考方案2】:你可以创建单例
+(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
【讨论】:
感谢罗马!我从来没有使用过单音,所以我要去全能的 raywenderlich!如果我得到任何东西,我会更新我的答案。 顺便问一下,我是否使用了正确的下载方法?请注意,我想在后台(异步)下载文件,以便用户可以在文件下载时浏览应用程序。 我可以从您发布的代码中看到 - 是的))AFNetworking 是用于处理 Web 服务的好库。 AFNetworking 正在使用在后台线程中执行的 NSOperations以上是关于如何在其他视图中恢复数据下载?的主要内容,如果未能解决你的问题,请参考以下文章