0

所以,我了解代表的基本示例。我所拥有的是:

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

4

1 回答 1

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 单例,您可能不应该将其设为单例。

于 2012-08-10T21:44:22.733 回答