2

私はこれを丸一日理解しようとしてきましたが、必死になり始めています...だからここに私の問題があります:

ファイルのリストを表示するテーブル ビュー コントローラーがあります。ユーザーは、このリストに新しいファイルをダウンロードできます。ダウンロードは別のクラスで非同期に処理します。新しいファイルがダウンロードされたら、テーブル ビュー コントローラーに通知して、リストを更新できるようにします。複数のインスタンスに通知する必要があるため、デリゲート パターンはここにはあまり適していません。そのため、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 で) 登録した直後にテスト通知を投稿すると、機能します。

他に何を確認すればよいかわかりません...ヒントは大歓迎です。ありがとう!

4

0 に答える 0