从不同的ViewController获取下载进度

时间:2013-04-27 10:34:45

标签: iphone ios uiviewcontroller afnetworking

我有VideoListController。它有下载按钮的视频列表。当我按下载按钮时,控件将转移到DetailViewController。在DetailViewController中,我使用AFNetworking下载文件。

如果我从VideoListController返回DetailViewController。如何从VideoListController了解下载进度或下载完成情况。我想知道这一点,因为基于此我将重新加载列表以显示播放按钮而不是下载。

2 个答案:

答案 0 :(得分:1)

我认为针对您的问题的最佳解决方案是创建delegateDetailViewController可以用来相互通信的自定义VideoListController协议。查看此帖子了解更多信息How to use custom delegates in Objective-C

简而言之,策略如下:  1. DetailViewController定义了delegate protocol,用于将事件传递给其委托  2. VideoListController成为上传进展或完成时知道的代理人  3. VideoListController跟踪哪些DetailViewController已完成下载

这是代码: DetailViewController.h

@class DetailViewController;
@protocol Delegate <NSObject>
- (void) detailViewController: (DetailViewController *) theDetailViewController didFinishDownloadingVideoWithResults:(BOOL)successful;
@end

@property (nonatomic, weak) id<DetailViewController> delegate;

DetailViewController.m: 下载完成后,请执行以下操作:

if ([[self delegate] respondsToSelector:@selector(detailViewController:didFinishDownloadingVideoWithResults:)]){
   [[self delegate] detailViewController:self didFinishDownloadingVideoWithResults:YES];
}

现在,在VideoListController.m中确保您自己成为DetailViewController的代表。

[theDetailViewController setDelegate:self];

实现委托方法。例如,您可以使用字典来定义哪些DetailViewControllers已完成下载:

   - (void) detailViewController: (DetailViewController *) theDetailViewController didFinishDownloadingVideoWithResults:(BOOL)successful{
      detailViewControllersDownloadInformation[theDetailViewController] = @(successful);
}

现在,每当您需要检查DetailViewController是否确实完成了下载时,您只需检查该词典

if (detailViewControllersDownloadInformation[theDetailViewController] && detailViewControllersDownloadInformation[theDetailViewController] == @(YES)){
    // Did download a video
}

请注意,我提供的解决方案只会让您知道下载是否已完成。如果您还想跟踪进度,则需要将其作为委托中的附加参数传递。我们还假设您将所有DetailViewController保留在内存中。如果您发布并重用它们,则需要跟踪在不同数据结构中下载的元素。

答案 1 :(得分:0)

我使用NSNotificationCenter工作了。 在DetailViewController的viewDidLoad中,我添加了这个

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(movieDownloadDidFinish)
                                             name:@"MovieDownloadDidFinishNotification"
                                           object:nil];

下载完成后。我称之为:

[[NSNotificationCenter defaultCenter] postNotificationName:@"MovieDownloadDidFinishNotification" object:self];

当单击导航控制器中的后退按钮时,我从DetailViewController中删除了观察者

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"MovieDownloadDidFinishNotification" object:nil];

在DetailViewController中添加了在下载完成时调用的方法。

-(void) movieDownloadDidFinish {
    NSLog(@"MovieDownloadDidFinish on DetailViewController");
}

现在在VideoListController的viewDidAppear中,我添加了观察者

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(movieDownloadDidFinish)
                                             name:@"MovieDownloadDidFinishNotification"
                                           object:nil];

在ViewDidDisappear的VideoListController中,我删除了观察者

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"MovieDownloadDidFinishNotification" object:nil];

在VideoListController中添加了在下载完成时调用的方法。

-(void) movieDownloadDidFinish {
    NSLog(@"MovieDownloadDidFinish On VideoListController");
}

这样,当DetailViewController可见时,调用DetailViewController的方法movieDownloadDidFinish,同样在VideoListController可见时调用VideoListController的movieDownloadDidFinish。