mirror of
https://github.com/oxen-io/session-ios.git
synced 2023-12-13 21:30:14 +01:00
Fix database deadlock in contacts manager.
// FREEBIE
This commit is contained in:
parent
5b9978b07f
commit
147107d76c
1 changed files with 25 additions and 16 deletions
|
@ -207,28 +207,37 @@ void onAddressBookChanged(ABAddressBookRef notifyAddressBook, CFDictionaryRef in
|
|||
NSMutableDictionary<NSString *, SignalAccount *> *signalAccountMap = [NSMutableDictionary new];
|
||||
NSMutableArray<SignalAccount *> *signalAccounts = [NSMutableArray new];
|
||||
NSArray<Contact *> *contacts = self.allContacts;
|
||||
|
||||
// We use a transaction only to load the SignalRecipients for each contact,
|
||||
// in order to avoid database deadlock.
|
||||
NSMutableDictionary<NSString *, NSArray<SignalRecipient *> *> *contactIdToSignalRecipientsMap =
|
||||
[NSMutableDictionary new];
|
||||
[[TSStorageManager sharedManager].dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) {
|
||||
for (Contact *contact in contacts) {
|
||||
NSArray<SignalRecipient *> *signalRecipients = [contact signalRecipientsWithTransaction:transaction];
|
||||
for (SignalRecipient *signalRecipient in
|
||||
[signalRecipients sortedArrayUsingSelector:@selector(compare:)]) {
|
||||
SignalAccount *signalAccount = [[SignalAccount alloc] initWithSignalRecipient:signalRecipient];
|
||||
signalAccount.contact = contact;
|
||||
if (signalRecipients.count > 1) {
|
||||
signalAccount.hasMultipleAccountContact = YES;
|
||||
signalAccount.multipleAccountLabelText =
|
||||
[[self class] accountLabelForContact:contact recipientId:signalRecipient.recipientId];
|
||||
}
|
||||
if (signalAccountMap[signalAccount.recipientId]) {
|
||||
DDLogInfo(@"Ignoring duplicate contact: %@, %@", signalAccount.recipientId, contact.fullName);
|
||||
continue;
|
||||
}
|
||||
signalAccountMap[signalAccount.recipientId] = signalAccount;
|
||||
[signalAccounts addObject:signalAccount];
|
||||
}
|
||||
contactIdToSignalRecipientsMap[contact.uniqueId] = signalRecipients;
|
||||
}
|
||||
}];
|
||||
|
||||
for (Contact *contact in contacts) {
|
||||
NSArray<SignalRecipient *> *signalRecipients = contactIdToSignalRecipientsMap[contact.uniqueId];
|
||||
for (SignalRecipient *signalRecipient in [signalRecipients sortedArrayUsingSelector:@selector(compare:)]) {
|
||||
SignalAccount *signalAccount = [[SignalAccount alloc] initWithSignalRecipient:signalRecipient];
|
||||
signalAccount.contact = contact;
|
||||
if (signalRecipients.count > 1) {
|
||||
signalAccount.hasMultipleAccountContact = YES;
|
||||
signalAccount.multipleAccountLabelText =
|
||||
[[self class] accountLabelForContact:contact recipientId:signalRecipient.recipientId];
|
||||
}
|
||||
if (signalAccountMap[signalAccount.recipientId]) {
|
||||
DDLogInfo(@"Ignoring duplicate contact: %@, %@", signalAccount.recipientId, contact.fullName);
|
||||
continue;
|
||||
}
|
||||
signalAccountMap[signalAccount.recipientId] = signalAccount;
|
||||
[signalAccounts addObject:signalAccount];
|
||||
}
|
||||
}
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
self.signalAccountMap = [signalAccountMap copy];
|
||||
self.signalAccounts = [signalAccounts copy];
|
||||
|
|
Loading…
Reference in a new issue