委派,如何使用非viewController设置层次结构

时间:2012-08-10 21:32:20

标签: iphone

所以,我理解代表的基本例子。我有这个:

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:因此,在主屏幕上,他们可以进行下载,然后我们会要求网络服务获取数据,并在长时间下载时显示进度。

场景2:OtherViewController可能需要来自互联网的一些简单信息。它向Web服务请求该数据,并更新该视图。

目前,所有内容都通过NSNotifications处理。

使用NSNotification的场景1:主屏幕显示模态视图控制器,将ProgressViewController添加为Web服务的侦听器,ProgressViewController在需要时更新其屏幕。

使用NSNotification的场景2:其他视图控制器在viewDidLoad中注册为Web服务的观察者,在需要时从Web服务获取回调。

我想知道是否以及如何通过委托来解决这个问题。我认为拥有一个可以实现如下方法的WebServiceDelegate可能会更好:

- (void)webService:(WebService *)webService didUpdateProgress:(double)progress;

我看到的问题是,如果我的网络服务启动了下载大量数据的请求,目前主屏幕视图控制器会这样做:

ProgressViewController *pvc = [[ProgressViewController alloc] initWithNibName:@"ProgressViewController" bundle:nil];

显示视图控制器,然后侦听进度更新。

我不知道如何通过委托来实现,因为我不知道在哪里设置委托属性。在WebService中,我需要执行以下操作:

self.WebServiceDelegate = progressViewController;

但是,不会在Web服务中创建progressViewController。它在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服务委托方法。这似乎有点迂回,我不知道是否有更好的方法来做到这一点,或者只是坚持通知。谢谢!

1 个答案:

答案 0 :(得分:1)

如果我理解你的情况,homeViewController有一个对web服务的引用,然后homeViewController创建一个ProgressViewController的实例。然后,ProgressViewController需要使用委派从该Web服务获取更新。你可以尝试这样的东西作为HomeViewController的一部分:

ProgressViewController *pvc = ProgressViewController *pvc = [[ProgressViewController alloc] initWithNibName:@"ProgressViewController" bundle:nil];
self.webService.delegate = pvc;

当然,这需要homeViewController引用WebService(我称之为webService)。

  

Web服务知道它应该显示此视图控制器

它真的不应该知道任何这些。它只需要做它的事情(下载,上传,等等),如果有什么要报告,它通过向其委托发送消息来实现。该代表(无论是谁)将随后更新视图。

编辑:我刚才意识到WebService是一个单身人士。我认为单身人士的首选方法实际上是使用通知。由于所有视图控制器都可以访问单例,因此委托并不总是一个选项,因为所有这些视图控制器可能需要更新正在进行的操作,而对象只能有一个委托。如果只有一个或两个视图控制器使用WebService单例,则可能不应该将其设为单例。