我有VideoListController
。它有下载按钮的视频列表。当我按下载按钮时,控件将转移到DetailViewController
。在DetailViewController
中,我使用AFNetworking
下载文件。
如果我从VideoListController
返回DetailViewController
。如何从VideoListController
了解下载进度或下载完成情况。我想知道这一点,因为基于此我将重新加载列表以显示播放按钮而不是下载。
答案 0 :(得分:1)
我认为针对您的问题的最佳解决方案是创建delegate
和DetailViewController
可以用来相互通信的自定义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。