我有一个VideoListController
. 它有带有下载按钮的视频列表。当我按下下载按钮时,控制权转移到DetailViewController
. 在DetailViewController
,我正在使用AFNetworking
下载文件。
如果我VideoListController
从DetailViewController
. 我如何知道下载进度或何时从VideoListController
. 我想知道这一点,因为基于此我将重新加载列表以显示播放按钮而不是下载。
我有一个VideoListController
. 它有带有下载按钮的视频列表。当我按下下载按钮时,控制权转移到DetailViewController
. 在DetailViewController
,我正在使用AFNetworking
下载文件。
如果我VideoListController
从DetailViewController
. 我如何知道下载进度或何时从VideoListController
. 我想知道这一点,因为基于此我将重新加载列表以显示播放按钮而不是下载。
我认为解决您的问题的最佳方法是创建一个自定义delegate
协议,该协议DetailViewController
可以VideoListController
用来相互通信。查看这篇文章以获取更多信息如何在 Objective-C 中使用自定义委托
简而言之,策略如下: 1.DetailViewController
定义 adelegate
protocol
用于将事件传递给它的委托 2.VideoListController
成为它的委托,它知道每当上传进行或完成时 3.VideoListController
跟踪哪些DetailViewController
s 有完成下载
这是代码
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
}
请记住,我提供的解决方案只会让您知道下载是否已完成。如果您还想跟踪进度,则需要将其作为附加参数传递给委托。我们还假设您将所有DetailViewController
s 保存在内存中。如果您发布并重用它们,您将需要跟踪以不同数据结构下载的元素。
我使用 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 。