Skip to content

Commit

Permalink
First pass at handling remote deletions.
Browse files Browse the repository at this point in the history
  • Loading branch information
lukeredpath committed Mar 19, 2010
1 parent a26dc16 commit 7a5b068
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 9 deletions.
1 change: 0 additions & 1 deletion Classes/PTProject.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

+ (NSEntityDescription *)entityFromContext:(NSManagedObjectContext *)context;

+ (NSArray *)findAll:(NSManagedObjectContext *)inContext;
+ (NSArray *)findInContext:(NSManagedObjectContext *)inContext predicate:(NSPredicate *)predicate;

+ (id)findAllRemote:(id<PTResultsDelegate>)resultsDelegate;
Expand Down
5 changes: 0 additions & 5 deletions Classes/PTProject.m
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,6 @@ - (void)syncSelfToManagedObject:(NSManagedObject *)object;
#pragma mark -
#pragma mark Queries

+ (NSArray *)findAll:(NSManagedObjectContext *)inContext;
{
return [self findInContext:inContext predicate:nil];
}

+ (NSArray *)findInContext:(NSManagedObjectContext *)inContext predicate:(NSPredicate *)predicate;
{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
Expand Down
24 changes: 21 additions & 3 deletions Classes/PTSyncManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@ - (id)initWithManagedObjectContext:(NSManagedObjectContext *)context;
return self;
}

- (void)dealloc;
{
[managedObjectContext release];
[super dealloc];
}

- (void)synchronizeRemote:(id)remoteModel;
{
NSAssert1([remoteModel respondsToSelector:@selector(findAllRemote:)],
Expand All @@ -40,20 +46,32 @@ - (void)remoteModel:(id)modelKlass didFinishLoading:(NSArray *)results;
{
NSEntityDescription *entity = [modelKlass performSelector:@selector(entityFromContext:) withObject:managedObjectContext];


// TODO it seems wrong that remoteId is hardcoded here, what if I want to use UUID instead?
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"remoteId in %@", [results valueForKeyPath:@"remoteId"]];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];
[fetchRequest setPredicate:predicate];

NSArray *managedObjectsForResults = [managedObjectContext executeFetchRequest:fetchRequest error:nil];
NSSet *managedObjectsForResultsSet = [NSSet setWithArray:[managedObjectContext executeFetchRequest:fetchRequest error:nil]];
[fetchRequest release];

// delete all objects that no longer exist on the server
NSFetchRequest *fetchRequestForAll = [[NSFetchRequest alloc] init];
[fetchRequestForAll setEntity:entity];
NSArray *fetchResults = [managedObjectContext executeFetchRequest:fetchRequestForAll error:nil];
[fetchRequestForAll release];

NSMutableSet *allObjectSet = [[NSMutableSet alloc] initWithArray:fetchResults];
[allObjectSet minusSet:managedObjectsForResultsSet];
for (NSManagedObject *object in allObjectSet) {
[managedObjectContext deleteObject:object];
}
[allObjectSet release];

// the reason I'm munging this into dictionary keyed by remote ID is to make it easier
// to look up an existing NSManagedObject for a given record, perhaps there is a better way?
NSMutableDictionary *managedObjectsByRemoteId = [NSMutableDictionary dictionary];
for (NSManagedObject *object in managedObjectsForResults) {
for (NSManagedObject *object in managedObjectsForResultsSet) {
[managedObjectsByRemoteId setObject:object forKey:[object valueForKey:@"remoteId"]];
}

Expand Down
2 changes: 2 additions & 0 deletions Classes/PTTrackerRemoteModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,6 @@
- (void)setManagedObject:(NSManagedObject *)object isMaster:(BOOL)isMaster;
- (void)syncManagedObjectToSelf:(NSManagedObject *)_managedObject;
- (void)syncSelfToManagedObject:(NSManagedObject *)_managedObject;

+ (NSArray *)findAll:(NSManagedObjectContext *)inContext;
@end
8 changes: 8 additions & 0 deletions Classes/PTTrackerRemoteModel.m
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,14 @@ - (void)syncSelfToManagedObject:(NSManagedObject *)object;
self.remoteId = [object valueForKey:@"remoteId"];
}

#pragma mark -
#pragma mark Queries

+ (NSArray *)findAll:(NSManagedObjectContext *)inContext;
{
return [self findInContext:inContext predicate:nil];
}

#pragma mark -
#pragma mark Default HRRestConnection delegate methods

Expand Down

0 comments on commit 7a5b068

Please sign in to comment.