From 72d0ba6b3245bb1d5d3bc775b5a919f52339eb1f Mon Sep 17 00:00:00 2001
From: cramakri <cramakri>
Date: Mon, 4 Feb 2013 13:06:13 +0000
Subject: [PATCH] MINOR: Factored out data pruning from data synchronizing.

SVN: 28269
---
 .../BisKit/Classes/CISDOBIpadServiceManager.m | 62 +++++++++++--------
 1 file changed, 36 insertions(+), 26 deletions(-)

diff --git a/openbis-ipad/BisKit/Classes/CISDOBIpadServiceManager.m b/openbis-ipad/BisKit/Classes/CISDOBIpadServiceManager.m
index 5da9c7610ea..4574c322c01 100644
--- a/openbis-ipad/BisKit/Classes/CISDOBIpadServiceManager.m
+++ b/openbis-ipad/BisKit/Classes/CISDOBIpadServiceManager.m
@@ -72,9 +72,8 @@ NSString *const CISDOBIpadServiceManagerErrorDomain = @"CISDOBIpadServiceManager
 @property(strong, readonly) NSManagedObjectContext *managedObjectContext;
 @property(copy, nonatomic) NSError *error;
 
-@property(nonatomic) BOOL prune;
 @property(strong, nonatomic) NSDate *pruneCutoffDate;
-@property(readonly) NSArray *deletedEntities;
+@property(readonly) NSArray *deletedEntityPermIds;
 
 // Initialization
 - (id)initWithServiceManager:(CISDOBIpadServiceManager *)serviceManager;
@@ -159,6 +158,13 @@ static NSManagedObjectContext* GetMainThreadManagedObjectContext(NSURL* storeUrl
    return ((CISDOBLiveConnection *)(self.service.connection)).sessionToken;
 }
 
+// Save the MOC. The deletedEntities array should be non-nil
+- (BOOL)saveManagedObjectContextDeleting:(NSArray *)deletedEntities error:(NSError **)error
+{
+    if (self.mocSaveBlock) self.mocSaveBlock(self, deletedEntities);
+    return [self.managedObjectContext save: error];
+}
+
 - (void)syncEntities:(NSArray *)rawEntities pruning:(BOOL)prune notifying:(CISDOBIpadServiceManagerCall *)managerCall
 {
     void (^syncBlock)(void) = ^{
@@ -170,17 +176,21 @@ static NSManagedObjectContext* GetMainThreadManagedObjectContext(NSURL* storeUrl
         synchronizer.pruneCutoffDate = self.lastRootSetUpdateDate;
         [synchronizer run];
         
+        if (prune) {
+            CISDOBBackgroundDataPruner *pruner = [[CISDOBBackgroundDataPruner alloc] initWithServiceManager: self];
+            pruner.pruneCutoffDate = self.lastRootSetUpdateDate;
+            [pruner run];
+        }
+        
         [[NSNotificationCenter defaultCenter] postNotificationName: CISDOBIpadServiceDidSynchEntitiesNotification object: self];         
         
         void (^notifyBlock)(void) = ^ {
             // Save the MOC and notifiy the client on the main thread
             CISDOBBackgroundDataSynchronizer *notifySynchronizer = synchronizer;
             if(!notifySynchronizer.error) {
-                NSError *error;
-                if (self.mocSaveBlock) self.mocSaveBlock(self, notifySynchronizer.deletedEntities);
-                if (![self.managedObjectContext save: &error]) {
-                    notifySynchronizer.error = error;
-                }
+                NSError *error = nil;
+                [self saveManagedObjectContextDeleting: notifySynchronizer.deletedEntities error: &error];
+                notifySynchronizer.error = error;
             }
             [notifySynchronizer notifyCallOfResult];
         };
@@ -543,15 +553,15 @@ static NSManagedObjectContext* GetMainThreadManagedObjectContext(NSURL* storeUrl
         }
     }
     // If pruning is requested, remove entities that were not updated since the prune cutoff date
-    if (_prune && self.pruneCutoffDate) {
-        // Remove all entities that were not mentioned
-        NSFetchRequest *fetchRequest = [self.serviceManager fetchRequestForEntitiesNotUpdatedSince: self.pruneCutoffDate];
-        NSArray *entitiesToDelete = [self.managedObjectContext executeFetchRequest: fetchRequest error: &error];
-        for (CISDOBIpadEntity *entity in entitiesToDelete) {
-            [(NSMutableArray *)_deletedEntities addObject: entity.permId];
-            [self.managedObjectContext deleteObject: entity];
-        }
-    }
+//    if (_prune && self.pruneCutoffDate) {
+//        // Remove all entities that were not mentioned
+//        NSFetchRequest *fetchRequest = [self.serviceManager fetchRequestForEntitiesNotUpdatedSince: self.pruneCutoffDate];
+//        NSArray *entitiesToDelete = [self.managedObjectContext executeFetchRequest: fetchRequest error: &error];
+//        for (CISDOBIpadEntity *entity in entitiesToDelete) {
+//            [(NSMutableArray *)_deletedEntities addObject: entity.permId];
+//            [self.managedObjectContext deleteObject: entity];
+//        }
+//    }
     
     success = [self.managedObjectContext save: &error];
     if (!success) {
@@ -586,7 +596,7 @@ static NSManagedObjectContext* GetMainThreadManagedObjectContext(NSURL* storeUrl
     _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSConfinementConcurrencyType];
     _managedObjectContext.parentContext = _serviceManager.managedObjectContext;
     _error = nil;
-    _deletedEntities = [NSMutableArray array];
+    _deletedEntityPermIds = [NSMutableArray array];
     
     return self;
 }
@@ -594,17 +604,17 @@ static NSManagedObjectContext* GetMainThreadManagedObjectContext(NSURL* storeUrl
 // Actions
 - (void)run
 {
+    if (!self.pruneCutoffDate) return;
+    
     BOOL success;
     NSError *error;
-    // If pruning is requested, remove entities that were not updated since the prune cutoff date
-    if (_prune && self.pruneCutoffDate) {
-        // Remove all entities that were not mentioned
-        NSFetchRequest *fetchRequest = [self.serviceManager fetchRequestForEntitiesNotUpdatedSince: self.pruneCutoffDate];
-        NSArray *entitiesToDelete = [self.managedObjectContext executeFetchRequest: fetchRequest error: &error];
-        for (CISDOBIpadEntity *entity in entitiesToDelete) {
-            [(NSMutableArray *)_deletedEntities addObject: entity.permId];
-            [self.managedObjectContext deleteObject: entity];
-        }
+    // Remove entities that were not updated since the prune cutoff date
+    // Remove all entities that were not mentioned
+    NSFetchRequest *fetchRequest = [self.serviceManager fetchRequestForEntitiesNotUpdatedSince: self.pruneCutoffDate];
+    NSArray *entitiesToDelete = [self.managedObjectContext executeFetchRequest: fetchRequest error: &error];
+    for (CISDOBIpadEntity *entity in entitiesToDelete) {
+        [(NSMutableArray *)_deletedEntityPermIds addObject: entity.permId];
+        [self.managedObjectContext deleteObject: entity];
     }
     
     success = [self.managedObjectContext save: &error];
-- 
GitLab