0

我有一个VideoListController. 它有带有下载按钮的视频列表。当我按下下载按钮时,控制权转移到DetailViewController. 在DetailViewController,我正在使用AFNetworking下载文件。

如果我VideoListControllerDetailViewController. 我如何知道下载进度或何时从VideoListController. 我想知道这一点,因为基于此我将重新加载列表以显示播放按钮而不是下载。

4

2 回答 2

1

我认为解决您的问题的最佳方法是创建一个自定义delegate协议,该协议DetailViewController可以VideoListController用来相互通信。查看这篇文章以获取更多信息如何在 Objective-C 中使用自定义委托

简而言之,策略如下: 1.DetailViewController定义 adelegate protocol用于将事件传递给它的委托 2.VideoListController成为它的委托,它知道每当上传进行或完成时 3.VideoListController跟踪哪些DetailViewControllers 有完成下载

这是代码 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];

并实现委托方法。例如,您可以有一个字典来定义哪些 DetailViewController 已完成下载:

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

现在,每当您需要检查 a 是否DetailViewController确实完成了下载时,您所要做的就是检查该字典

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

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

于 2013-04-27T11:30:30.467 回答
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];

并且在 VideoListController 的 viewDidDisappear 中,我移除了观察者

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

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

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

这样,当 DetailViewController 可见时,会调用 DetailViewController 的方法 movieDownloadDidFinish ,类似地,当 VideoListController 可见时会调用 VideoListController 的 movieDownloadDidFinish 。

于 2013-04-30T07:15:49.643 回答