|
|
@ -133,32 +133,27 @@ void onAddressBookChanged(ABAddressBookRef notifyAddressBook, CFDictionaryRef in
|
|
|
|
|
|
|
|
|
|
|
|
- (void)setupAddressBookIfNecessary
|
|
|
|
- (void)setupAddressBookIfNecessary
|
|
|
|
{
|
|
|
|
{
|
|
|
|
@synchronized(self)
|
|
|
|
dispatch_async(ADDRESSBOOK_QUEUE, ^{
|
|
|
|
{
|
|
|
|
// De-bounce address book setup.
|
|
|
|
|
|
|
|
if (self.isContactsUpdateInFlight) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
// We only need to set up our address book once;
|
|
|
|
// We only need to set up our address book once;
|
|
|
|
// after that we only need to respond to onAddressBookChanged.
|
|
|
|
// after that we only need to respond to onAddressBookChanged.
|
|
|
|
if (self.addressBookReference) {
|
|
|
|
if (self.addressBookReference) {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// De-bounce address book setup.
|
|
|
|
|
|
|
|
if (self.isContactsUpdateInFlight) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
self.isContactsUpdateInFlight = YES;
|
|
|
|
self.isContactsUpdateInFlight = YES;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dispatch_async(ADDRESSBOOK_QUEUE, ^{
|
|
|
|
|
|
|
|
TOCFuture *future = [OWSContactsManager asyncGetAddressBook];
|
|
|
|
TOCFuture *future = [OWSContactsManager asyncGetAddressBook];
|
|
|
|
[future thenDo:^(id addressBook) {
|
|
|
|
[future thenDo:^(id addressBook) {
|
|
|
|
// Success.
|
|
|
|
// Success.
|
|
|
|
@synchronized(self)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
OWSAssert(self.isContactsUpdateInFlight);
|
|
|
|
OWSAssert(self.isContactsUpdateInFlight);
|
|
|
|
OWSAssert(!self.addressBookReference);
|
|
|
|
OWSAssert(!self.addressBookReference);
|
|
|
|
|
|
|
|
|
|
|
|
self.addressBookReference = addressBook;
|
|
|
|
self.addressBookReference = addressBook;
|
|
|
|
self.isContactsUpdateInFlight = NO;
|
|
|
|
self.isContactsUpdateInFlight = NO;
|
|
|
|
}
|
|
|
|
|
|
|
|
ABAddressBookRef cfAddressBook = (__bridge ABAddressBookRef)addressBook;
|
|
|
|
ABAddressBookRef cfAddressBook = (__bridge ABAddressBookRef)addressBook;
|
|
|
|
ABAddressBookRegisterExternalChangeCallback(cfAddressBook, onAddressBookChanged, (__bridge void *)self);
|
|
|
|
ABAddressBookRegisterExternalChangeCallback(cfAddressBook, onAddressBookChanged, (__bridge void *)self);
|
|
|
|
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
|
|
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
|
@ -167,13 +162,10 @@ void onAddressBookChanged(ABAddressBookRef notifyAddressBook, CFDictionaryRef in
|
|
|
|
}];
|
|
|
|
}];
|
|
|
|
[future catchDo:^(id failure) {
|
|
|
|
[future catchDo:^(id failure) {
|
|
|
|
// Failure.
|
|
|
|
// Failure.
|
|
|
|
@synchronized(self)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
OWSAssert(self.isContactsUpdateInFlight);
|
|
|
|
OWSAssert(self.isContactsUpdateInFlight);
|
|
|
|
OWSAssert(!self.addressBookReference);
|
|
|
|
OWSAssert(!self.addressBookReference);
|
|
|
|
|
|
|
|
|
|
|
|
self.isContactsUpdateInFlight = NO;
|
|
|
|
self.isContactsUpdateInFlight = NO;
|
|
|
|
}
|
|
|
|
|
|
|
|
}];
|
|
|
|
}];
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|