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

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

以上是关于如何在其他视图中恢复数据下载?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用状态恢复来恢复视图控制器的子视图

保存以编程方式为片段创建的视图并在 onresume 中恢复

索引,视图,导入导出,备份,恢复

USB因误点击造成数据丢失,如何恢复其功能运用和数据

数据恢复软件恢复的文件无法打开

如何保存对象以供以后使用?通过 JSON 或其他方式发送并存储在数据库中然后恢复