28

CNContactStoreDidChangeNotificationアプリがバックグラウンド状態にあるときに連絡先データベースがいつ変更されるかを観察できます。オブザーバーが 1 つだけ追加されたことは確かですNSNotificationCenter。問題はNSNotificationCenter、新しい連絡先を 1 つだけ追加したとしても、複数回 (2 回、3 回、5 回、さらにはそれ以上) 投稿することです。問題はどこだ?

4

3 に答える 3

4

オブザーバーを複数回追加していないことを確認してください。-addObserverこれは、(たとえば) ビュー コントローラーから、-viewDidLoadまたはビュー コントローラー内で呼び出した場合 (-viewDidAppearアプリケーションの存続期間中に複数回呼び出される可能性があるため)、またはアプリ デリゲートのアプリケーション状態コールバックのいずれかから ( -applicationDidBecomeActive-applicationWillResignActive-applicationDidEnterBackground-applicationWillEnterForegroundなど)。

への呼び出しを条件付きでラップして、-addObserver1 回だけ呼び出すことができるようにし (フラグを設定)、NSLog ステートメントをその周りに配置して、複数回アクセスした場合にデバッグ コンソールで確認できるようにします。コードを検索して、-addObserver忘れている可能性のある への他の呼び出しを探します。

-removeObserver念のため、追加する前に呼び出します (追加したときと同じ名前とオブジェクトを渡すようにしてください)。-removeObserver存在しないオブザーバーを 呼び出しても問題ありません。これは修正というより応急処置であることに注意してください。コードは、既に追加したかどうかを判断できるほど十分にスマートである必要がありますが、これは問題の診断に役立つ場合があります)。

オブザーバーを (1 回だけ!) 追加する簡単な最小限のテスト プログラムを作成しCNContactStoreDidChangeNotificationたところ、連絡先を追加または変更したときに 1 回だけ通知を受け取ります。自分で同様のテスト プログラムを作成し、同じ結果が得られるかどうかを確認してください。テスト プログラムが正しく動作する場合、アプリが予期しないことを行っている可能性があります (-addObserver複数回呼び出しています)。

于 2017-04-26T17:56:34.627 に答える