だから、私はデリゲートの基本的な例を理解しています。私が持っているのはこれです:
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サービスデリゲートメソッド。それは一種の回り道のようで、これを行うためのより良い方法があるのか、それとも単に通知に固執するのかわかりませんでした。ありがとう!