所以,我了解代表的基本示例。我所拥有的是:
WebService (class to handle grabbing web data)
HomeViewController (home screen)
ProgressViewController (shows the progress of a long download modally for long downloads)
OtherViewController (another view controller that might make a quick network request)
场景 1:因此,他们可以从主屏幕进行下载,然后我们会要求 Web 服务获取数据,如果下载时间较长,则显示进度。
场景 2:OtherViewController 可能需要一些来自 Internet 的简单信息。它向 Web 服务请求该数据,并更新该视图。
目前,一切都由 NSNotifications 处理。
使用 NSNotification 的场景 1:主屏幕呈现模式视图控制器,将 ProgressViewController 添加为 web 服务的侦听器,ProgressViewController 在需要时更新其屏幕。
使用 NSNotification 的场景 2:其他视图控制器在 viewDidLoad 中注册为 Web 服务的观察者,在需要时从 Web 服务获取回调。
我想知道是否以及如何通过委托进行设置。我认为拥有一个可以实现以下方法的 WebServiceDelegate 可能会更好:
- (void)webService:(WebService *)webService didUpdateProgress:(double)progress;
我看到的问题是,如果我的 Web 服务开始请求下载大量数据,目前,主屏幕视图控制器将执行以下操作:
ProgressViewController *pvc = [[ProgressViewController alloc] initWithNibName:@"ProgressViewController" bundle:nil];
呈现视图控制器,然后它侦听进度更新。
我不知道如何通过委托来做到这一点,因为我不知道在哪里设置委托属性。在 WebService 中,我需要执行以下操作:
self.WebServiceDelegate = progressViewController;
但是,progressViewController 不会在 Web 服务中创建。它在 homeViewController 上创建。到目前为止,我唯一想到的就是执行以下操作:
ProgressViewController *pvc = [[ProgressViewController alloc] initWithNibName:@"ProgressViewController" bundle:nil];
pvc.progressViewControllerDelegate = [WebServiceManager sharedInstance];
self.webServiceManagerProgressDelegate = pvc;
NSDictionary *progressViewDict = @{ @"ProgressViewController" : pvc };
[[NSNotificationCenter defaultCenter] postNotificationName:WebServiceShowProgressViewNotification object:self userInfo:progressViewDict];
Web服务知道它应该显示这个视图控制器,发布通知,然后任何人(在我的情况下是主视图)正在监听,可以显示progressViewController,然后progressViewController可以显示进度并响应Web 服务委托方法。这似乎有点迂回,我不知道是否有更好的方法来做到这一点,或者只是坚持通知。谢谢!