私はこれを丸一日理解しようとしてきましたが、必死になり始めています...だからここに私の問題があります:
ファイルのリストを表示するテーブル ビュー コントローラーがあります。ユーザーは、このリストに新しいファイルをダウンロードできます。ダウンロードは別のクラスで非同期に処理します。新しいファイルがダウンロードされたら、テーブル ビュー コントローラーに通知して、リストを更新できるようにします。複数のインスタンスに通知する必要があるため、デリゲート パターンはここにはあまり適していません。そのため、NSNotificationCenter を使用したいと考えています。
ビュー コントローラーの viewDidAppear: メソッドで、オブザーバーとして登録します。
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(downloadComplete:)
name:kDownloadCompleteNotification
object:nil];
これは、通知を送信する前に確実に呼び出されます。これは、ユーザーがビュー コントローラーの追加ボタンをタップして新しいダウンロードを開始する必要があるためです。ダウンロードが完了したら、(DownloadManager クラスで) 通知を投稿します。
[[NSNotificationCenter defaultCenter]
postNotificationName:kDownloadCompleteNotification
object:self];
ただし、ビュー コントローラーの通知ハンドラー メソッドが呼び出されることはありません。ブレークポイントを追加しましたが、呼び出されていません。また、オブジェクトを nil に設定しようとしました。変わりはない。
- (void)downloadComplete:(NSNotification *)notification {
NSLog(@"Inserting new files into table view.");
}
通知の登録と投稿の両方がメインスレッドで行われます(とにかく問題ではないと思います)。ビューコントローラーは解放されていません。私が知る限り、タイプミスはありませんでした。名前の文字列は同じ定数です。
オブザーバーとして登録するときに name 引数を nil に設定すると、すべての種類の (システム) 通知を受け取りますが、自分自身の通知は受け取りません。ただし、(viewDidAppear で) 登録した直後にテスト通知を投稿すると、機能します。
他に何を確認すればよいかわかりません...ヒントは大歓迎です。ありがとう!