9

iOSアプリを登録して、電話の名簿の変更を聞くという奇妙な問題があります。アドレス帳で何かが変更されたときに正しいメソッドが呼び出されますが、2〜6回呼び出されます。

オブジェクトが作成されると(シングルトン、つまり1つのオブジェクトのみ)、次のコードで通知を登録します。

ABAddressBookRegisterExternalChangeCallback(notificationAddressBook, addressBookChanged, (__bridge_retained  void *)self);

呼び出されるメソッドは次のようになります。

void addressBookChanged(ABAddressBookRef ab, CFDictionaryRef info, void *context){
ABAddressBookRevert(ab);

    NSLog(@"ADDRESSBOOK CHANGED");
    [phoneBookCopy updateCopy];
}

これを解決する方法はありますか?

4

4 に答える 4

1

少し前に同じ問題があり、重複したコールバックを処理するために NSTimer を作成して解決する必要がありました。

[self.changeTimer invalidate];
self.changeTimer = nil;
self.changeTimer = [NSTimer scheduledTimerWithTimeInterval:3.0
                                                            target:self
                                                          selector:@selector(handleAdressBookExternalCallbackBackground)
                                                          userInfo:nil
                                                           repeats:NO];
于 2012-05-16T19:56:49.140 に答える
0

同様の問題がありました。コールバックは、最初は 1 回しか呼び出されませんが、外出してアドレス帳を 2 回目に変更すると、複数回呼び出されます。私にとって、問題はABAddressBookRegisterExternalChangeCallbackappDelegate のapplicationWillResignActive:メソッドで呼び出されていたメソッドでした。

私がアドレス帳を使用していた方法は、同期設定のためでした。問題は、同期設定が変更されたときだけでなく、同期設定が保存されるたびに外部コールバックを登録していたことです。

説明のために、appDelegate で呼び出していたコードを次に示します。

- (void)saveSettings
{
NSUserDefaults *syncSettingsData = [NSUserDefaults standardUserDefaults];
[syncSettingsData setObject:[NSNumber numberWithBool:self.isSyncingiPadContacts] forKey:SYNC_IPAD_CONTACTS_TURNED_ON];
[self setAddressBookChanged];
[syncSettingsData synchronize];
}

- (void)setAddressBookChanged
{
    if (self.isSyncingiPadContacts)
    {
        ABAddressBookRegisterExternalChangeCallback(self.addressBook, addressBookChanged, (__bridge void *)self);
    }
    else
    {
        ABAddressBookUnregisterExternalChangeCallback(self.addressBook, addressBookChanged, (__bridge void *) self);
    }
}

setAddressBookChangedメソッド内のへの呼び出しを削除しsaveSettings、アドレス帳の作成時 (初回セットアップ時) およびユーザーが同期設定を変更するたびに呼び出すようにしました。

うまくいけば、これはあなたを助けます。

于 2013-10-22T14:53:43.110 に答える