Skip to content

Commit

Permalink
Modified PKSyncManagerDatastoreIncomingChangesNotification to include…
Browse files Browse the repository at this point in the history
… any errors in the userInfo dictionary at key PKSyncManagerDatastoreIncomingChangesErrorKey.
  • Loading branch information
Liron Yahdav committed Nov 4, 2014
1 parent caaf4b0 commit d89df6d
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 17 deletions.
2 changes: 2 additions & 0 deletions ParcelKit/PKSyncManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,11 @@ extern NSString * const PKSyncManagerDatastoreStatusKey;
Notification that is posted when the DBDatastore has incoming changes.
The userInfo of the notification will contain the DBDatastore change NSDictionary in `PKSyncManagerDatastoreStatusKey`
and any errors in `PKSyncManagerDatastoreIncomingChangesErrorKey`.
*/
extern NSString * const PKSyncManagerDatastoreIncomingChangesNotification;
extern NSString * const PKSyncManagerDatastoreIncomingChangesKey;
extern NSString * const PKSyncManagerDatastoreIncomingChangesErrorKey;

/**
Notification that is posted when the sync is ok.
Expand Down
46 changes: 30 additions & 16 deletions ParcelKit/PKSyncManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
NSString * const PKSyncManagerDatastoreStatusKey = @"status";
NSString * const PKSyncManagerDatastoreIncomingChangesNotification = @"PKSyncManagerDatastoreIncomingChanges";
NSString * const PKSyncManagerDatastoreIncomingChangesKey = @"changes";
NSString * const PKSyncManagerDatastoreIncomingChangesErrorKey = @"error";
NSString * const PKSyncManagerDatastoreLastSyncDateNotification = @"PKSyncManagerDatastoreLastSyncDateNotification";
NSString * const PKSyncManagerDatastoreLastSyncDateKey = @"lastSyncDate";

Expand Down Expand Up @@ -181,8 +182,10 @@ - (void)stopObserving
}

#pragma mark - Updating Core Data
- (BOOL)updateCoreDataWithDatastoreChanges:(NSDictionary *)changes
- (BOOL)updateCoreDataWithDatastoreChanges:(NSDictionary *)changes error:(NSError **)error
{
NSAssert(*error == nil, @"Error must be nil");

static NSString * const PKUpdateManagedObjectKey = @"object";
static NSString * const PKUpdateRecordKey = @"record";

Expand Down Expand Up @@ -210,8 +213,8 @@ - (BOOL)updateCoreDataWithDatastoreChanges:(NSDictionary *)changes
for (DBRecord *record in records) {
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"%K == %@", strongSelf.syncAttributeName, record.recordId]];

NSError *error = nil;
NSArray *managedObjects = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
NSError *fetchRequestError = nil;
NSArray *managedObjects = [managedObjectContext executeFetchRequest:fetchRequest error:&fetchRequestError];
if (managedObjects) {
NSManagedObject *managedObject = [managedObjects lastObject];

Expand All @@ -228,24 +231,30 @@ - (BOOL)updateCoreDataWithDatastoreChanges:(NSDictionary *)changes
[updates addObject:@{PKUpdateManagedObjectKey: managedObject, PKUpdateRecordKey: record}];
}
} else {
NSLog(@"Error executing fetch request: %@", error);
NSLog(@"Error executing fetch request: %@", fetchRequestError);
}
}
}];


for (NSDictionary *update in updates) {
NSManagedObject *managedObject = update[PKUpdateManagedObjectKey];
DBRecord *record = update[PKUpdateRecordKey];
[managedObject pk_setPropertiesWithRecord:record syncAttributeName:strongSelf.syncAttributeName];
@try {
for (NSDictionary *update in updates) {
NSManagedObject *managedObject = update[PKUpdateManagedObjectKey];
DBRecord *record = update[PKUpdateRecordKey];
[managedObject pk_setPropertiesWithRecord:record syncAttributeName:strongSelf.syncAttributeName];
}
}

@catch (NSException *exception) {
NSMutableDictionary *errorUserInfo = [@{@"exceptionName" : exception.name, @"exceptionReason" : exception.reason} mutableCopy];
if (exception.userInfo != nil) {
errorUserInfo[@"exceptionUserInfo"] = exception.userInfo;
}
*error = [NSError errorWithDomain:@"ParcelKit" code:1 userInfo:errorUserInfo];
return;
}

if ([managedObjectContext hasChanges]) {
[[NSNotificationCenter defaultCenter] addObserver:strongSelf selector:@selector(syncManagedObjectContextDidSave:) name:NSManagedObjectContextDidSaveNotification object:managedObjectContext];
NSError *error = nil;
if (![managedObjectContext save:&error]) {
NSLog(@"Error saving managed object context: %@", error);
}
[managedObjectContext save:error];
[[NSNotificationCenter defaultCenter] removeObserver:strongSelf name:NSManagedObjectContextDidSaveNotification object:managedObjectContext];
}
}];
Expand Down Expand Up @@ -318,8 +327,13 @@ - (BOOL)syncDatastore
DBError *error = nil;
NSDictionary *changes = [self.datastore sync:&error];
if (changes) {
if ([self updateCoreDataWithDatastoreChanges:changes]) {
[[NSNotificationCenter defaultCenter] postNotificationName:PKSyncManagerDatastoreIncomingChangesNotification object:self userInfo:@{PKSyncManagerDatastoreIncomingChangesKey: changes}];
NSError *updateError = nil;
NSMutableDictionary *userInfo = [@{PKSyncManagerDatastoreIncomingChangesKey : changes} mutableCopy];
if ([self updateCoreDataWithDatastoreChanges:changes error:&updateError]) {
if (updateError != nil) {
userInfo[PKSyncManagerDatastoreIncomingChangesErrorKey] = updateError;
}
[[NSNotificationCenter defaultCenter] postNotificationName:PKSyncManagerDatastoreIncomingChangesNotification object:self userInfo:userInfo];
}
[[NSNotificationCenter defaultCenter] postNotificationName:PKSyncManagerDatastoreLastSyncDateNotification object:self userInfo:@{PKSyncManagerDatastoreLastSyncDateKey: [NSDate date]}];

Expand Down
25 changes: 24 additions & 1 deletion ParcelKitTests/PKSyncManagerTests.m
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,15 @@
#import "Author.h"

@interface PKSyncManager (ParcelKitTests)
- (void)updateCoreDataWithDatastoreChanges:(NSDictionary *)changes;

- (BOOL)updateCoreDataWithDatastoreChanges:(NSDictionary *)changes error:(NSError **)error;
@end

@interface PKSyncManagerTests : XCTestCase
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) id datastore;
@property (strong, nonatomic) PKSyncManager *syncManager;
@property (strong, nonatomic) NSError *datastoreChangeError;
@end

@implementation PKSyncManagerTests
Expand Down Expand Up @@ -252,6 +254,27 @@ - (void)testIncomingDatastoreChangeShouldUpdateCoreDataWithSingleObject
XCTAssertEqualObjects(@"To Kill a Mockingbird", [object valueForKey:@"title"], @"");
}

- (void)testIncomingDatastoreChangeShouldReturnErrorWithInvalidObject
{
self.datastoreChangeError = nil;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(datastoreDidChange:) name:PKSyncManagerDatastoreIncomingChangesNotification object:nil];

[self.syncManager startObserving];

PKRecordMock *book = [PKRecordMock record:@"1" withFields:@{}];
[self.datastore updateStatus:[PKDatastoreStatusMock datastoreStatusWithIncoming:YES] withChanges:@{@"books": @[book]}];

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Book"];
NSArray *objects = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
XCTAssertEqual(0, (int)[objects count], @"");

XCTAssertNotNil(self.datastoreChangeError, @"");
}

- (void)datastoreDidChange:(NSNotification *)notification {
self.datastoreChangeError = notification.userInfo[PKSyncManagerDatastoreIncomingChangesErrorKey];
}

- (void)testIncomingDatastoreChangeShouldUpdateCoreDataWithMultipleObjects
{
[self.syncManager startObserving];
Expand Down

0 comments on commit d89df6d

Please sign in to comment.