Revert "Attempt to fix background crash in a different way"

This reverts commit d039ecd87e.
pull/134/head
Niels Andriesse 5 years ago
parent 4a3fc98c6d
commit 3c5a9e7bdc

@ -120,27 +120,26 @@ public final class LokiAPI : NSObject {
}.map { Set($0) }.retryingIfNeeded(maxRetryCount: maxRetryCount) }.map { Set($0) }.retryingIfNeeded(maxRetryCount: maxRetryCount)
} }
public static func getDestinations(for hexEncodedPublicKey: String) -> Promise<Set<Destination>> { public static func getDestinations(for hexEncodedPublicKey: String) -> Promise<[Destination]> {
var result: Promise<Set<Destination>>! var result: Promise<[Destination]>!
storage.dbReadWriteConnection.readWrite { transaction in storage.dbReadWriteConnection.readWrite { transaction in
result = getDestinations(for: hexEncodedPublicKey, in: transaction) result = getDestinations(for: hexEncodedPublicKey, in: transaction)
} }
return result return result
} }
public static func getDestinations(for hexEncodedPublicKey: String, in transaction: YapDatabaseReadWriteTransaction) -> Promise<Set<Destination>> { public static func getDestinations(for hexEncodedPublicKey: String, in transaction: YapDatabaseReadWriteTransaction) -> Promise<[Destination]> {
// All of this has to happen on DispatchQueue.global() due to the way OWSMessageManager works // All of this has to happen on DispatchQueue.global() due to the way OWSMessageManager works
let (promise, seal) = Promise<Set<Destination>>.pending() let (promise, seal) = Promise<[Destination]>.pending()
func getDestinations(in transaction: YapDatabaseReadTransaction? = nil) { func getDestinations(in transaction: YapDatabaseReadTransaction? = nil) {
func getDestinationsInternal(in transaction: YapDatabaseReadTransaction) { func getDestinationsInternal(in transaction: YapDatabaseReadTransaction) {
let query = YapDatabaseQuery(string: "WHERE \(DeviceLinkIndex.slaveHexEncodedPublicKey) = ? OR \(DeviceLinkIndex.masterHexEncodedPublicKey) = ?", parameters: [ hexEncodedPublicKey, hexEncodedPublicKey ]) var destinations: [Destination] = []
let deviceLinks = Set(DeviceLinkIndex.getDeviceLinks(for: query, in: transaction)) let masterHexEncodedPublicKey = storage.getMasterHexEncodedPublicKey(for: hexEncodedPublicKey, in: transaction) ?? hexEncodedPublicKey
var destinations = Set(deviceLinks.flatMap { let masterDestination = Destination(hexEncodedPublicKey: masterHexEncodedPublicKey, kind: .master)
return [ Destination(hexEncodedPublicKey: $0.master.hexEncodedPublicKey, kind: .master), Destination(hexEncodedPublicKey: $0.slave.hexEncodedPublicKey, kind: .slave) ] destinations.append(masterDestination)
}) let deviceLinks = storage.getDeviceLinks(for: masterHexEncodedPublicKey, in: transaction)
if destinations.isEmpty { let slaveDestinations = deviceLinks.map { Destination(hexEncodedPublicKey: $0.slave.hexEncodedPublicKey, kind: .slave) }
destinations.insert(Destination(hexEncodedPublicKey: hexEncodedPublicKey, kind: .master)) destinations.append(contentsOf: slaveDestinations)
}
seal.fulfill(destinations) seal.fulfill(destinations)
} }
if let transaction = transaction, transaction.connection.pendingTransactionCount != 0 { if let transaction = transaction, transaction.connection.pendingTransactionCount != 0 {

@ -29,13 +29,8 @@ public extension OWSPrimaryStorage {
} }
public func getDeviceLinks(for masterHexEncodedPublicKey: String, in transaction: YapDatabaseReadTransaction) -> Set<DeviceLink> { public func getDeviceLinks(for masterHexEncodedPublicKey: String, in transaction: YapDatabaseReadTransaction) -> Set<DeviceLink> {
let collection = getDeviceLinkCollection(for: masterHexEncodedPublicKey) let query = YapDatabaseQuery(string: "WHERE \(DeviceLinkIndex.masterHexEncodedPublicKey) = ?", parameters: [ masterHexEncodedPublicKey ])
var result: Set<DeviceLink> = [] return Set(DeviceLinkIndex.getDeviceLinks(for: query, in: transaction))
transaction.enumerateRows(inCollection: collection) { _, object, _, _ in
guard let deviceLink = object as? DeviceLink else { return }
result.insert(deviceLink)
}
return result
} }
public func getDeviceLink(for slaveHexEncodedPublicKey: String, in transaction: YapDatabaseReadTransaction) -> DeviceLink? { public func getDeviceLink(for slaveHexEncodedPublicKey: String, in transaction: YapDatabaseReadTransaction) -> DeviceLink? {

@ -999,11 +999,11 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
BOOL isFriendRequestMessage = [message isKindOfClass:LKFriendRequestMessage.class]; BOOL isFriendRequestMessage = [message isKindOfClass:LKFriendRequestMessage.class];
BOOL isSessionRequestMessage = [message isKindOfClass:LKSessionRequestMessage.class]; BOOL isSessionRequestMessage = [message isKindOfClass:LKSessionRequestMessage.class];
[[LKAPI getDestinationsFor:contactID] [[LKAPI getDestinationsFor:contactID]
.thenOn(OWSDispatch.sendingQueue, ^(NSSet<LKDestination *> *destinations) { .thenOn(OWSDispatch.sendingQueue, ^(NSArray<LKDestination *> *destinations) {
// Get master destination // Get master destination
LKDestination *masterDestination = [destinations filtered:^BOOL(LKDestination *destination) { LKDestination *masterDestination = [destinations filtered:^BOOL(LKDestination *destination) {
return [destination.kind isEqual:@"master"]; return [destination.kind isEqual:@"master"];
}].allObjects.firstObject; }].firstObject;
// Send to master destination // Send to master destination
if (masterDestination != nil) { if (masterDestination != nil) {
TSContactThread *thread = [TSContactThread getOrCreateThreadWithContactId:masterDestination.hexEncodedPublicKey]; TSContactThread *thread = [TSContactThread getOrCreateThreadWithContactId:masterDestination.hexEncodedPublicKey];
@ -1016,7 +1016,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
} }
} }
// Get slave destinations // Get slave destinations
NSSet *slaveDestinations = [destinations filtered:^BOOL(LKDestination *destination) { NSArray *slaveDestinations = [destinations filtered:^BOOL(LKDestination *destination) {
return [destination.kind isEqual:@"slave"]; return [destination.kind isEqual:@"slave"];
}]; }];
// Send to slave destinations (using a best attempt approach (i.e. ignoring the message send result) for now) // Send to slave destinations (using a best attempt approach (i.e. ignoring the message send result) for now)

Loading…
Cancel
Save