2011-01-18 15 views
6

私はABAddressBookを私のアプリで使用しています。
ABへのアクセスは、UIを解放するために別のスレッドから行われます。
私は、ABインスタンスへのアクセスが常に同じスレッドから行われなければならず、この理由からラッパーを構築していることに気付いています。
ラッパーはシングルトンで、独自のバックグラウンドスレッドを維持します。
呼び出し元スレッドは、実装の終了時まで待機し、最後に関連するデータ(連絡先リスト、特定の連絡先など)でout引数を埋める間に、ラッパーに来るすべてのメッセージがバックグラウンドスレッドに自動的にリダイレクトされます。 。iPhone:アドレス帳が時々消される

ただし、デバイスのアドレス帳が空(消去)になることがあります。
アプリを10〜20回使用するたびに

だから、私はいくつかの質問があります:私は、専用のスレッドでABからABRecordRefを取得した後、私は同じスレッドでもABRecordRefからデータを取得しなければならないのか、それは別のスレッドかもしれ

  • を?私はまた、ABRecordRefのラッパーを持っているので、ABから連絡先を取得するときに私は人のラッパーオブジェクトを埋めるので、それを元のスレッドから(ABRecordRefから読み込んで)使用します。
  • 私はAB UI API(人のピッカーナビゲーションコントローラ、新しい人ビューコントローラなど)を使用して、それらにABAddressBookのインスタンスを渡すと、APIがこのABインスタンスを使用しないという心配がありますそれを作成した同じスレッド?私はABインスタンスの代わりにNULLを渡すことができ、APIは独自のABを使用することを見てきましたが、連絡先を変更するにはどうすればいいですか?この場合、私はそれにABRecordRefインスタンスを渡さなければなりません...
  • 私は考えなかったことがありますか?

ありがとうございます。

から
マイケル

答えて

4

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

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

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

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

関連する問題