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(@“下载完成!”);}我得到了你下载完整内容的观点,但你能告诉我,你如何在其他视图控制器中更新下载进度值吗