Iphone 从不同的ViewController获取下载进度

Iphone 从不同的ViewController获取下载进度,iphone,ios,uiviewcontroller,afnetworking,Iphone,Ios,Uiviewcontroller,Afnetworking,我有一个视频列表控制器。它有带下载按钮的视频列表。当我按下下载按钮时,控制被转移到DetailViewController。在DetailViewController中,我正在使用AFNetworking下载文件 如果我从DetailViewController返回到VideoListController。我如何知道下载进度或从VideoListController下载何时完成。我想知道这一点,因为基于此,我将重新加载列表以显示播放按钮,而不是下载。我认为解决您的问题的最佳方法是创建一个自定义的

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


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

我认为解决您的问题的最佳方法是创建一个自定义的
委托
协议,
详细视图控制器
视频列表控制器
可以使用该协议相互通信。查看此帖子以了解更多信息

简言之,战略如下: 1.
DetailViewController
定义了一个
委托
协议
,该协议用于将事件传递给其委托 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;
现在,在
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
}

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

我使用NSNotificationCenter使其正常工作。 在DetailViewController的viewDidLoad中,我添加了以下内容

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(movieDownloadDidFinish)
                                             name:@"MovieDownloadDidFinishNotification"
                                           object:nil];
下载完成后。我称之为:

[[NSNotificationCenter defaultCenter] postNotificationName:@"MovieDownloadDidFinishNotification" object:self];
单击导航控制器中的backbutton时,我会从DetailViewController中删除观察者

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"MovieDownloadDidFinishNotification" object:nil];
并在DetailViewController中添加了在下载完成时调用的方法

-(void) movieDownloadDidFinish {
    NSLog(@"MovieDownloadDidFinish on DetailViewController");
}
-(void) movieDownloadDidFinish {
    NSLog(@"MovieDownloadDidFinish On VideoListController");
}
现在在VideoListController的视图中,我添加了观察者

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(movieDownloadDidFinish)
                                             name:@"MovieDownloadDidFinishNotification"
                                           object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"MovieDownloadDidFinishNotification" object:nil];
在VideoListController的视图中,我移除了观察者

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(movieDownloadDidFinish)
                                             name:@"MovieDownloadDidFinishNotification"
                                           object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"MovieDownloadDidFinishNotification" object:nil];
并在VideoListController中添加了在下载完成时调用的方法

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

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

我在这里遇到错误:@property(非原子,弱)id delegate;我认为应该是身份授权;是吗?我是这样实现的:@class DetailViewController;@协议委托-(void)detailViewController:(detailViewController*)detailViewController未完成视频下载,结果:(BOOL)成功;@end@property(非原子,弱)id委托@下载完成后,在DetailViewController中结束。我添加以下内容:如果([[self delegate]respondsToSelector:@selector(detailViewController:didFinishDownloadingVideoWithResults:)){[[self delegate]detailViewController:self-detailViewController:didFinishDownloadingVideoWithResults:是];}但我得到了这个错误:使用了未声明的标识符“didFinishDownloadingVideoWithResults”有一个输入错误,请使用:[[self-delegate]detailViewController:self-didFinishDownloadingVideoWithResults:YES]立即尝试;由于收到警告,在VideoListController中,我添加了如下委托:@interface RowViewController:UITableViewController当我从DetailViewController返回到VideoListController时,下载时,仍然没有调用此方法-(void)detailViewController:(detailViewController*)detailViewController完成了视频下载,结果:(BOOL)成功{NSLog(@“下载完成!”);}我得到了你下载完整内容的观点,但你能告诉我,你如何在其他视图控制器中更新下载进度值吗