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は、インターネットからの簡単な情報を必要とする場合があります。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サービスがこのViewControllerを表示することになっていることを認識し、その通知を投稿すると、リッスンしている人(私の場合はホームビュー)が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サービスがこのViewControllerを表示することになっていることを知っている場合

それは本当にそれについて知らないはずです。それはそのこと(ダウンロード、アップロードなど)を行う必要があり、報告するものがある場合は、デリゲートにメッセージを送信することによってそれを行います。その代理人(それが誰であっても)は、それに応じてビューを更新します。

編集: WebServiceがシングルトンであることに気づきました。シングルトンに適したアプローチは、実際には通知を使用することだと思います。すべてのViewControllerはシングルトンにアクセスできるため、これらすべてのView Controllerは何が起こっているかを更新する必要があるかもしれませんが、オブジェクトは1つのデリゲートしか持てないため、委任が常にオプションであるとは限りません。1つまたは2つのビューコントローラのみがWebServiceシングルトンを使用する場合は、おそらくシングルトンにしないでください。

于 2012-08-10T21:44:22.733 に答える