6

ABAddressBookは自分のアプリでを使用しています。
ABへのアクセスは、UIを解放するために別のスレッドから行われます。
ABインスタンスへのアクセスは常に同じスレッドからでなければならないという事実を認識しており、この理由でラッパーを作成しました。
ラッパーはシングルトンであり、独自のバックグラウンドスレッドを維持します。
ラッパーに届くすべてのメッセージは自動的にバックグラウンドスレッドにリダイレクトされますが、呼び出し元のスレッドは実装が終了するまで待機し、最後に関連データ(連絡先リスト、特定の連絡先など)を引数に入力します。

それでも、デバイスのアドレス帳が空になる(消去される)ことがあります。
アプリの10〜20回目の使用ごと。

だから、私はいくつかの質問があります:

  • 専用スレッドのABからABRecordRefを取得した後、同じスレッドのABRecordRefからデータを取得する必要がありますか、それとも別のスレッドである可能性がありますか?ABRecordRefのラッパーもあるので、ABから連絡先を取得するときは、personラッパーオブジェクトに入力し、その後、元のスレッドからそれを使用します(ABRecordRefから読み取ります)。
  • AB UI API(パーソンピッカーナビゲーションコントローラー、新しいパーソンビューコントローラーなど)を使用してそれらにABAddressBookのインスタンスを渡す場合、APIが同じスレッドからのこのABインスタンスを使用しないという事実を心配する必要があります。それを作成しましたか?ABインスタンスの代わりにNULLを渡すことができ、APIが独自のABを使用することを確認しましたが、連絡先を変更する場合はどうすればよいですか?この場合、ABRecordRefインスタンスを渡す必要があります...
  • 私が考えていなかった他の何かがありますか?

前もって感謝します。

-
マイケル

4

1 に答える 1

4

アドレスブックには、ABAddressBookCreate()を呼び出したのと同じスレッドからのみアクセスする必要があります。別のスレッドでABRecordRefを使用することはできません。レコードIDとコピーされたデータのみがスレッド間で安全に渡されます。

通常、シリアルディスパッチキューを作成し、メインスレッドをブロックできないアドレス帳呼び出しのラッパーとして使用します。

UIを使用する場合は、メインスレッドでABAddressBookCreate()を呼び出し、それをUI呼び出しに使用する必要があります。

UIを使用して連絡先を変更する必要がある場合は、連絡先を変更して保存してから、バックグラウンドスレッドまたはキューのアドレス帳を更新して、最新の変更が含まれるようにします。この目的のために、通知コールバックABAddressBookRegisterExternalChangeCallbackがあります。

于 2012-01-12T21:16:21.563 に答える