我认为针对您的问题的最佳解决方案是创建一个自定义的delegate 协议,DetailViewController 和VideoListController 可以使用该协议相互通信。查看此帖子以获取更多信息How to use custom delegates in Objective-C
简而言之,策略如下:
1. DetailViewController 定义了一个 delegate 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);
}
现在,当您需要检查 DetailViewController 是否确实完成了下载时,您所要做的就是检查该字典
if (detailViewControllersDownloadInformation[theDetailViewController] && detailViewControllersDownloadInformation[theDetailViewController] == @(YES)){
// Did download a video
}
请记住,我提供的解决方案只会让您知道下载是否已完成。如果您还想跟踪进度,则需要将其作为附加参数传递给委托。我们还假设您将所有DetailViewControllers 保存在内存中。如果您发布并重用它们,您将需要跟踪以不同数据结构下载的元素。