diff --git a/wire-ios-request-strategy/Sources/Object Syncs/Helpers/ZMChangeTrackerBootstrap.h b/wire-ios-request-strategy/Sources/Object Syncs/Helpers/ZMChangeTrackerBootstrap.h index 8389615f981..3941a7c0643 100644 --- a/wire-ios-request-strategy/Sources/Object Syncs/Helpers/ZMChangeTrackerBootstrap.h +++ b/wire-ios-request-strategy/Sources/Object Syncs/Helpers/ZMChangeTrackerBootstrap.h @@ -25,5 +25,5 @@ - (instancetype)initWithManagedObjectContext:(NSManagedObjectContext *)context changeTrackers:(NSArray *)changeTrackers; - (void)fetchObjectsForChangeTrackers; - +- (void)addChangeTrackers:(NSArray *)changeTrackers; @end diff --git a/wire-ios-request-strategy/Sources/Object Syncs/Helpers/ZMChangeTrackerBootstrap.m b/wire-ios-request-strategy/Sources/Object Syncs/Helpers/ZMChangeTrackerBootstrap.m index dfaf4719629..f69de97d4da 100644 --- a/wire-ios-request-strategy/Sources/Object Syncs/Helpers/ZMChangeTrackerBootstrap.m +++ b/wire-ios-request-strategy/Sources/Object Syncs/Helpers/ZMChangeTrackerBootstrap.m @@ -55,16 +55,15 @@ - (NSEntityDescription *)entityForEntityName:(NSString *)name; return entity; } -- (void)fetchObjectsForChangeTrackers -{ - NSArray *fetchRequests = [self.changeTrackers mapWithBlock:^id(id tracker) { +- (void)fetchObjectsForChangeTrackers:(NSArray*)trackers { + NSArray *fetchRequests = [trackers mapWithBlock:^id(id tracker) { return [tracker fetchRequestForTrackedObjects]; }]; NSMapTable *entityToRequestMap = [self sortFetchRequestsByEntity:fetchRequests]; NSMapTable *entityToResultsMap = [self executeMappedFetchRequests:entityToRequestMap]; - for (id tracker in self.changeTrackers) { + for (id tracker in trackers) { NSFetchRequest *request = [tracker fetchRequestForTrackedObjects]; if (request == nil) { continue; @@ -84,6 +83,20 @@ - (void)fetchObjectsForChangeTrackers } } +- (void)fetchObjectsForChangeTrackers +{ + [self fetchObjectsForChangeTrackers:self.changeTrackers]; +} + +- (void)addChangeTrackers:(NSArray *)changeTrackers +{ + [self fetchObjectsForChangeTrackers:changeTrackers]; + + NSMutableArray* allTrackers = changeTrackers.mutableCopy; + [allTrackers addObjectsFromArray:changeTrackers]; + self.changeTrackers = allTrackers; +} + - (NSMapTable *)sortFetchRequestsByEntity:(NSArray *)fetchRequests; { NSMapTable *requestsMap = [NSMapTable strongToStrongObjectsMapTable]; diff --git a/wire-ios-sync-engine/Source/Synchronization/StrategyDirectory.swift b/wire-ios-sync-engine/Source/Synchronization/StrategyDirectory.swift index 1c94c7b6d27..58fe407bf7d 100644 --- a/wire-ios-sync-engine/Source/Synchronization/StrategyDirectory.swift +++ b/wire-ios-sync-engine/Source/Synchronization/StrategyDirectory.swift @@ -29,6 +29,7 @@ public protocol StrategyDirectoryProtocol { var eventAsyncConsumers: [ZMEventAsyncConsumer] { get } var requestStrategies: [RequestStrategy] { get } var contextChangeTrackers: [ZMContextChangeTracker] { get } + var clientContextChangeTrackers: [ZMContextChangeTracker] { get } } @@ -40,6 +41,7 @@ public class StrategyDirectory: NSObject, StrategyDirectoryProtocol { public private(set) var eventConsumers: [ZMEventConsumer] public private(set) var eventAsyncConsumers: [ZMEventAsyncConsumer] public private(set) var contextChangeTrackers: [ZMContextChangeTracker] + public private(set) var clientContextChangeTrackers: [ZMContextChangeTracker] = [] public private(set) var initiateResetMLSConversationUseCaseFactory: (NSManagedObjectContext) -> WireRequestStrategy .InitiateResetMLSConversationUseCaseProtocol @@ -472,16 +474,16 @@ public class StrategyDirectory: NSObject, StrategyDirectoryProtocol { self.requestStrategies.append(contentsOf: strategies.compactMap { $0 as? RequestStrategy }) self.eventConsumers.append(contentsOf: strategies.compactMap { $0 as? ZMEventConsumer }) self.eventAsyncConsumers.append(contentsOf: strategies.compactMap { $0 as? ZMEventAsyncConsumer }) - self.contextChangeTrackers - .append(contentsOf: strategies.flatMap { (object: Any) -> [ZMContextChangeTracker] in - if let source = object as? ZMContextChangeTrackerSource { - return source.contextChangeTrackers - } else if let tracker = object as? ZMContextChangeTracker { - return [tracker] - } else { - return [] - } - }) + self.clientContextChangeTrackers = strategies.flatMap { (object: Any) -> [ZMContextChangeTracker] in + if let source = object as? ZMContextChangeTrackerSource { + return source.contextChangeTrackers + } else if let tracker = object as? ZMContextChangeTracker { + return [tracker] + } else { + return [] + } + } + self.contextChangeTrackers.append(contentsOf: clientContextChangeTrackers) } } diff --git a/wire-ios-sync-engine/Source/Synchronization/ZMSyncStrategy.h b/wire-ios-sync-engine/Source/Synchronization/ZMSyncStrategy.h index c757954c12b..86c9b7f25fe 100644 --- a/wire-ios-sync-engine/Source/Synchronization/ZMSyncStrategy.h +++ b/wire-ios-sync-engine/Source/Synchronization/ZMSyncStrategy.h @@ -43,6 +43,7 @@ eventProcessingTracker:(id _Nonnull)eventProcessingTracker; - (void)tearDown; +- (void)updateStrategyClientContextChangeTrackers; @property (nonatomic, readonly, nonnull) NSManagedObjectContext *syncMOC; @property (nonatomic, nullable) id eventProcessingTracker; diff --git a/wire-ios-sync-engine/Source/Synchronization/ZMSyncStrategy.m b/wire-ios-sync-engine/Source/Synchronization/ZMSyncStrategy.m index a852ca79257..0d65d10fd38 100644 --- a/wire-ios-sync-engine/Source/Synchronization/ZMSyncStrategy.m +++ b/wire-ios-sync-engine/Source/Synchronization/ZMSyncStrategy.m @@ -123,6 +123,13 @@ - (void)appTerminated:(NSNotification *)note [[NSNotificationCenter defaultCenter] removeObserver:self]; } +- (void)updateStrategyClientContextChangeTrackers +{ + [self.syncMOC performBlock:^{ + [self.changeTrackerBootStrap addChangeTrackers:self.strategyDirectory.clientContextChangeTrackers]; + }]; +} + - (NSManagedObjectContext *)moc { return self.syncMOC; diff --git a/wire-ios-sync-engine/Source/UserSession/ZMUserSession/ZMUserSession.swift b/wire-ios-sync-engine/Source/UserSession/ZMUserSession/ZMUserSession.swift index 8662c99bbf1..596e47c0614 100644 --- a/wire-ios-sync-engine/Source/UserSession/ZMUserSession/ZMUserSession.swift +++ b/wire-ios-sync-engine/Source/UserSession/ZMUserSession/ZMUserSession.swift @@ -676,6 +676,7 @@ public final class ZMUserSession: NSObject { incrementalSyncObserver: incrementalSyncObserver, metadata: resolvedBackendMetadata ) + syncStrategy?.updateClientContextChangeTrackers() } } diff --git a/wire-ios-sync-engine/Tests/Source/Synchronization/MockStrategyDirectory.swift b/wire-ios-sync-engine/Tests/Source/Synchronization/MockStrategyDirectory.swift index 5efe8b1c140..0a7def5c37d 100644 --- a/wire-ios-sync-engine/Tests/Source/Synchronization/MockStrategyDirectory.swift +++ b/wire-ios-sync-engine/Tests/Source/Synchronization/MockStrategyDirectory.swift @@ -20,6 +20,7 @@ import Foundation @objcMembers public class MockStrategyDirectory: NSObject, StrategyDirectoryProtocol { + public var clientContextChangeTrackers: [any ZMContextChangeTracker] = [] public var eventConsumers: [ZMEventConsumer] = []