From 947dfec4991b902f5d03c6f32112fdde1417451c Mon Sep 17 00:00:00 2001 From: cramakri <cramakri> Date: Thu, 1 Nov 2012 12:17:41 +0000 Subject: [PATCH] Fixed premature gc of the synchronizer object. Have a better way to have the synchronizer send notifications on the main thread and keep a live reference to it until it completes SVN: 27459 --- .../BisKit/Classes/CISDOBIpadServiceManager.m | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/openbis-ipad/BisKit/Classes/CISDOBIpadServiceManager.m b/openbis-ipad/BisKit/Classes/CISDOBIpadServiceManager.m index bc240a17513..c47d11fe71a 100644 --- a/openbis-ipad/BisKit/Classes/CISDOBIpadServiceManager.m +++ b/openbis-ipad/BisKit/Classes/CISDOBIpadServiceManager.m @@ -42,10 +42,10 @@ @interface CISDOBBackgroundDataSynchronizer : NSObject @property(readonly, weak) CISDOBIpadServiceManager *serviceManager; -@property(readonly) CISDOBIpadServiceManagerCall *managerCall; -@property(readonly) NSArray *rawEntities; -@property(readonly) NSManagedObjectContext *managedObjectContext; -@property(readonly) NSError *error; +@property(readonly, strong) CISDOBIpadServiceManagerCall *managerCall; +@property(readonly, strong) NSArray *rawEntities; +@property(readonly, strong) NSManagedObjectContext *managedObjectContext; +@property(nonatomic, copy) NSError *error; @property(nonatomic) BOOL prune; @@ -112,10 +112,23 @@ static NSManagedObjectContext* GetMainThreadManagedObjectContext(NSURL* storeUrl - (void)syncEntities:(NSArray *)rawEntities pruning:(BOOL)prune notifying:(CISDOBIpadServiceManagerCall *)managerCall { void (^syncBlock)(void) = ^{ + // Run the synchronizer in the background thread CISDOBBackgroundDataSynchronizer *synchronizer = [[CISDOBBackgroundDataSynchronizer alloc] initWithServiceManager: self managerCall: managerCall rawEntities: rawEntities]; synchronizer.prune = prune; [synchronizer run]; - [synchronizer performSelectorOnMainThread: @selector(notifyCallOfResult:) withObject: nil waitUntilDone: NO]; + + void (^notifyBlock)(void) = ^ { + // Save the MOC and notifiy the client on the main thread + CISDOBBackgroundDataSynchronizer *notifySynchronizer = synchronizer; + if(!notifySynchronizer.error) { + NSError *error; + if (![self.managedObjectContext save: &error]) { + notifySynchronizer.error = error; + } + } + [notifySynchronizer notifyCallOfResult: nil]; + }; + [[NSOperationQueue mainQueue] addOperationWithBlock: notifyBlock]; }; [_queue addOperationWithBlock: syncBlock]; } @@ -276,7 +289,7 @@ static NSManagedObjectContext* GetMainThreadManagedObjectContext(NSURL* storeUrl for (CISDOBIpadRawEntity *rawEntity in self.rawEntities) { success = [self synchEntity: rawEntity lastUpdateDate: lastUpdateDate error: &error]; if (!success) { - _error = [error copy]; + self.error = error; return; } } @@ -293,16 +306,16 @@ static NSManagedObjectContext* GetMainThreadManagedObjectContext(NSURL* storeUrl success = [self.managedObjectContext save: &error]; if (!success) { - _error = [error copy]; + self.error = error; return; } - _error = nil; + self.error = nil; } - (void)notifyCallOfResult:(id)args { - if (_error) { + if (self.error) { self.managerCall.serviceCall.fail(self.error); } else if (self.managerCall.success) { self.managerCall.success(self.rawEntities); -- GitLab