Fix freeze due to nested transaction

Not a fan of this solution; we need to clean up display name management
This commit is contained in:
nielsandriesse 2020-10-01 10:41:06 +10:00
parent 04a960c78c
commit fb7326a3b0
5 changed files with 30 additions and 10 deletions

View File

@ -74,6 +74,7 @@ extern const NSUInteger kOWSProfileManager_MaxAvatarDiameter;
- (nullable OWSAES256Key *)profileKeyForRecipientId:(NSString *)recipientId;
- (nullable NSString *)profileNameForRecipientWithID:(NSString *)recipientID avoidWriteTransaction:(BOOL)avoidWriteTransaction;
- (nullable NSString *)profileNameForRecipientWithID:(NSString *)recipientID;
- (nullable NSString *)profileNameForRecipientWithID:(NSString *)recipientID transaction:(YapDatabaseReadWriteTransaction *)transaction;

View File

@ -1025,6 +1025,11 @@ typedef void (^ProfileManagerFailureBlock)(NSError *error);
}
- (nullable NSString *)profileNameForRecipientWithID:(NSString *)recipientID
{
return [self profileNameForRecipientWithID:recipientID avoidingWriteTransaction:NO];
}
- (nullable NSString *)profileNameForRecipientWithID:(NSString *)recipientID avoidingWriteTransaction:(BOOL)avoidWriteTransaction
{
if ([self.tsAccountManager.localNumber isEqualToString:recipientID]) {
return self.localUserProfile.profileName;
@ -1047,18 +1052,22 @@ typedef void (^ProfileManagerFailureBlock)(NSError *error);
}
}
__block NSString *result;
if (!avoidWriteTransaction) {
__block NSString *result;
[LKStorage writeSyncWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
result = [self profileNameForRecipientWithID:recipientID transaction:transaction];
} error:nil];
[LKStorage writeSyncWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
result = [self profileNameForRecipientWithID:recipientID transaction:transaction];
} error:nil];
NSString *shortID = [recipientID substringWithRange:NSMakeRange(recipientID.length - 8, 8)];
NSString *suffix = [NSString stringWithFormat:@" (...%@)", shortID];
if ([result hasSuffix:suffix]) {
return [result substringToIndex:result.length - suffix.length];
NSString *shortID = [recipientID substringWithRange:NSMakeRange(recipientID.length - 8, 8)];
NSString *suffix = [NSString stringWithFormat:@" (...%@)", shortID];
if ([result hasSuffix:suffix]) {
return [result substringToIndex:result.length - suffix.length];
} else {
return result;
}
} else {
return result;
return recipientID;
}
}

View File

@ -13,6 +13,15 @@ public final class UserDisplayNameUtilities : NSObject {
}
// MARK: Sessions
@objc(getPrivateChatDisplayNameAvoidWriteTransaction:)
public static func getPrivateChatDisplayNameAvoidingWriteTransaction(for publicKey: String) -> String? {
if publicKey == userPublicKey {
return userDisplayName
} else {
return SSKEnvironment.shared.profileManager.profileNameForRecipient(withID: publicKey, avoidingWriteTransaction: true)
}
}
@objc public static func getPrivateChatDisplayName(for publicKey: String) -> String? {
if publicKey == userPublicKey {
return userDisplayName

View File

@ -133,7 +133,7 @@ const int32_t kGroupIdLength = 16;
if ([membersWhoLeft count] > 0) {
NSArray *oldMembersNames = [[membersWhoLeft allObjects] map:^NSString*(NSString* item) {
return [LKUserDisplayNameUtilities getPrivateChatDisplayNameFor:item];
return [LKUserDisplayNameUtilities getPrivateChatDisplayNameAvoidWriteTransaction:item];
}];
updatedGroupInfoString = [updatedGroupInfoString
stringByAppendingString:[NSString

View File

@ -14,6 +14,7 @@ NS_ASSUME_NONNULL_BEGIN
- (OWSAES256Key *)localProfileKey;
- (nullable NSString *)localProfileName;
- (nullable NSString *)profileNameForRecipientWithID:(NSString *)recipientID avoidingWriteTransaction:(BOOL)avoidWriteTransaction;
- (nullable NSString *)profileNameForRecipientWithID:(NSString *)recipientID;
- (nullable NSString *)profileNameForRecipientWithID:(NSString *)recipientID transaction:(YapDatabaseReadWriteTransaction *)transaction;
- (nullable NSString *)profilePictureURL;