Skip to content

Commit

Permalink
Merge pull request #410 from Simperium/develop
Browse files Browse the repository at this point in the history
Simperium Mark 0.7.5
  • Loading branch information
jleandroperez committed Nov 28, 2014
2 parents 9a44e18 + 39d0472 commit 2f0afe4
Show file tree
Hide file tree
Showing 10 changed files with 55 additions and 69 deletions.
2 changes: 1 addition & 1 deletion Simperium.podspec
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = "Simperium"
s.version = "0.7.4"
s.version = "0.7.5"
s.summary = "Simperium libraries."
s.description = "Simperium is a simple way for developers to move data as it changes, instantly and automatically."
s.homepage = "https://github.com/Simperium/simperium-ios"
Expand Down
30 changes: 4 additions & 26 deletions Simperium/SPCoreDataStorage.m
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,6 @@ @interface SPCoreDataStorage ()
@property (nonatomic, weak, readwrite) SPCoreDataStorage *sibling;
@property (nonatomic, strong, readwrite) NSConditionLock *mutex;
@property (nonatomic, strong, readwrite) NSMutableSet *privateStashedObjects;
@property (nonatomic, strong, readwrite) NSSet *privateInsertedObjects;
@property (nonatomic, strong, readwrite) NSSet *privateUpdatedObjects;
@property (nonatomic, strong, readwrite) NSSet *privateDeletedObjects;
- (void)addObserversForMainContext:(NSManagedObjectContext *)context;
- (void)addObserversForChildrenContext:(NSManagedObjectContext *)context;
@end
Expand Down Expand Up @@ -392,18 +389,6 @@ - (NSSet *)stashedObjects {
return [self.privateStashedObjects copy];
}

- (NSSet *)insertedObjects {
return [self.privateInsertedObjects copy];
}

- (NSSet *)updatedObjects {
return [self.privateUpdatedObjects copy];
}

- (NSSet *)deletedObjects {
return [self.privateDeletedObjects copy];
}


// CD specific
#pragma mark - Stashing and unstashing entities
Expand Down Expand Up @@ -466,22 +451,15 @@ - (void)managedContextWillSave:(NSNotification*)notification {

- (void)mainContextDidSave:(NSNotification *)notification {
// Expose the affected objects via the public properties
NSDictionary *userInfo = notification.userInfo;
self.privateDeletedObjects = [self filterRemotelyDeletedObjects:userInfo[NSDeletedObjectsKey]];
self.privateInsertedObjects = userInfo[NSInsertedObjectsKey];
self.privateUpdatedObjects = userInfo[NSUpdatedObjectsKey];
NSDictionary *userInfo = notification.userInfo;
NSSet *deletedObjects = [self filterRemotelyDeletedObjects:userInfo[NSDeletedObjectsKey]];

[self.delegate storageWillSave:self];
[self.delegate storageWillSave:self deletedObjects:deletedObjects];

// Save the writerMOC's changes
[self saveWriterContextWithCallback:^{
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate storageDidSave:self];

// Cleanup
self.privateDeletedObjects = nil;
self.privateInsertedObjects = nil;
self.privateUpdatedObjects = nil;
[self.delegate storageDidSave:self insertedObjects:userInfo[NSInsertedObjectsKey] updatedObjects:userInfo[NSUpdatedObjectsKey]];
});
}];
}
Expand Down
2 changes: 1 addition & 1 deletion Simperium/SPEnvironment.m
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
#endif

// TODO: Update this automatically via a script that looks at current git tag
NSString* const SPLibraryVersion = @"0.7.4";
NSString* const SPLibraryVersion = @"0.7.5";

// SSL Certificate Expiration: '2016-09-07 02:36:04 +0000' expressed as seconds since 1970
NSTimeInterval const SPCertificateExpiration = 1473215764;
Expand Down
23 changes: 2 additions & 21 deletions Simperium/SPJSONStorage.m
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,6 @@ - (void)simperiumSetValue:(id)anObject forKey:(id)aKey;
@end


@interface SPJSONStorage ()
@property (nonatomic, strong, readwrite) NSSet *privateUpdatedObjects;
@end


@implementation SPJSONStorage
@synthesize objects;
Expand Down Expand Up @@ -307,27 +303,12 @@ - (BOOL)save {
[updatedObjects addObjectsFromArray:objectsAsList];
}

self.privateUpdatedObjects = updatedObjects;
[delegate storageWillSave:self];

[delegate storageDidSave:self];
self.privateUpdatedObjects = nil;
[delegate storageWillSave:self deletedObjects:nil];
[delegate storageDidSave:self insertedObjects:nil updatedObjects:updatedObjects];

return NO;
}

- (NSSet *)insertedObjects {
return nil;
}

- (NSSet *)updatedObjects {
return [self.privateUpdatedObjects copy];
}

- (NSSet *)deletedObjects {
return nil;
}

- (NSSet *)stashedObjects {
return nil;
}
Expand Down
4 changes: 2 additions & 2 deletions Simperium/SPStorageObserver.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@
#pragma mark ====================================================================================

@protocol SPStorageObserver <NSObject>
- (void)storageWillSave:(id<SPStorageProvider>)storage;
- (void)storageDidSave:(id<SPStorageProvider>)storage;
- (void)storageWillSave:(id<SPStorageProvider>)storage deletedObjects:(NSSet *)deletedObjects;
- (void)storageDidSave:(id<SPStorageProvider>)storage insertedObjects:(NSSet *)insertedObjects updatedObjects:(NSSet *)updatedObjects;
@end
3 changes: 0 additions & 3 deletions Simperium/SPStorageProvider.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,6 @@

// Properties
@property (nonatomic, copy, readonly) NSSet *stashedObjects;
@property (nonatomic, copy, readonly) NSSet *insertedObjects;
@property (nonatomic, copy, readonly) NSSet *updatedObjects;
@property (nonatomic, copy, readonly) NSSet *deletedObjects;
@property (nonatomic, copy, readwrite) NSDictionary *metadata;

// Helpers
Expand Down
10 changes: 5 additions & 5 deletions Simperium/Simperium.m
Original file line number Diff line number Diff line change
Expand Up @@ -408,21 +408,21 @@ - (void)startWithAppID:(NSString *)identifier APIKey:(NSString *)key {
#pragma mark SPStorageObserver
#pragma mark ====================================================================================

- (void)storageWillSave:(id<SPStorageProvider>)storage {
- (void)storageWillSave:(id<SPStorageProvider>)storage deletedObjects:(NSSet *)deletedObjects {
if (!self.objectsShouldSync) {
return;
}

// Process deletions before the Save OP is complete. Otherwise the simperiumKey might not be accessible!
for (id<SPDiffable>deletedObject in storage.deletedObjects) {
for (id<SPDiffable>deletedObject in deletedObjects) {
if ([[deletedObject class] conformsToProtocol:@protocol(SPDiffable)]) {
[deletedObject.bucket.network sendObjectDeletion:deletedObject];
[deletedObject.bucket.storage stopManagingObjectWithKey:deletedObject.simperiumKey];
}
}
}

- (void)storageDidSave:(id<SPStorageProvider>)storage {
- (void)storageDidSave:(id<SPStorageProvider>)storage insertedObjects:(NSSet *)insertedObjects updatedObjects:(NSSet *)updatedObjects {
if (!self.objectsShouldSync) {
return;
}
Expand All @@ -437,13 +437,13 @@ - (void)storageDidSave:(id<SPStorageProvider>)storage {
}
}

for (id<SPDiffable>insertedObject in storage.insertedObjects) {
for (id<SPDiffable>insertedObject in insertedObjects) {
if ([[insertedObject class] conformsToProtocol:@protocol(SPDiffable)]) {
[insertedObject.bucket.network sendObjectChanges: insertedObject];
}
}

for (id<SPDiffable>updatedObject in storage.updatedObjects) {
for (id<SPDiffable>updatedObject in updatedObjects) {
if ([[updatedObject class] conformsToProtocol:@protocol(SPDiffable)]) {
[updatedObject.bucket.network sendObjectChanges: updatedObject];
}
Expand Down
35 changes: 32 additions & 3 deletions SimperiumTests/SPCoreDataStorageTests.m
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ - (void)testUpdatingChildEntitiesWhileDeletingRootEntity
XCTestExpectation *updateExpectation = [self expectationWithDescription:@"Update Expectation"];

SPStorageObserverAdapter *adapter = [SPStorageObserverAdapter new];
adapter.didSaveCallback = ^(NSSet *inserted, NSSet *updated, NSSet *deleted) {
adapter.didSaveCallback = ^(NSSet *inserted, NSSet *updated) {
dispatch_async(commentBucket.processorQueue, ^{
for (NSString* simperiumKey in postKeys) {
id<SPStorageProvider> threadSafeStorage = [self.storage threadSafeStorage];
Expand Down Expand Up @@ -208,7 +208,7 @@ - (void)testInsertedEntitiesAreImmediatelyAvailableInWorkerContexts {
SPBucket *postBucket = [self.simperium bucketForName:NSStringFromClass([Post class])];
XCTestExpectation *expectation = [self expectationWithDescription:@"Insertion Callback Expgiectation"];

adapter.didSaveCallback = ^(NSSet *inserted, NSSet *updated, NSSet *deleted) {
adapter.didSaveCallback = ^(NSSet *inserted, NSSet *updated) {
XCTAssert(inserted.count == kRaceConditionNumberOfEntities, @"Missing inserted entity");

dispatch_async(postBucket.processorQueue, ^{
Expand Down Expand Up @@ -244,7 +244,7 @@ - (void)testKeysForDeletedEntitiesIsAccessible {
// SPStorageObserverAdapter: Make sure that the inserted objects are there, if query'ed
SPStorageObserverAdapter *adapter = [SPStorageObserverAdapter new];

adapter.willSaveCallback = ^(NSSet *inserted, NSSet *updated, NSSet *deleted) {
adapter.willSaveCallback = ^(NSSet *deleted) {
XCTAssert(deleted.count == kRaceConditionNumberOfEntities, @"Missing inserted entity");

for (SPManagedObject *mainMO in deleted) {
Expand All @@ -270,4 +270,33 @@ - (void)testKeysForDeletedEntitiesIsAccessible {
}];
}

- (void)testMultipleContextSaveDontMissEntities {

NSString *postBucketName = NSStringFromClass([Post class]);
XCTestExpectation *expectation = [self expectationWithDescription:@"Insertion Callback Expgiectation"];

// SPStorageObserverAdapter: Make sure that the inserted objects are there, if query'ed
SPStorageObserverAdapter *adapter = [SPStorageObserverAdapter new];
self.storage.delegate = adapter;

__block NSInteger insertCount = 0;

adapter.didSaveCallback = ^(NSSet *inserted, NSSet *updated) {
insertCount += inserted.count;
if (insertCount == kStressIterations) {
[expectation fulfill];
}
};

// Proceed inserting [kRaceConditionNumberOfEntities] entities
for (NSInteger i = 0; ++i <= kStressIterations; ) {
[self.storage insertNewObjectForBucketName:postBucketName simperiumKey:nil];
[self.storage save];
}

[self waitForExpectationsWithTimeout:kExpectationTimeout handler:^(NSError *error) {
XCTAssertNil(error, @"Inserted Objects never reached DidSave Callback");
}];
}

@end
7 changes: 4 additions & 3 deletions SimperiumTests/SPStorageObserverAdapter.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,15 @@
#import "SPStorageObserver.h"


typedef void (^SPStorageObserverCallback)(NSSet *inserted, NSSet *updated, NSSet *deleted);
typedef void (^SPStorageWillSaveCallback)(NSSet *deleted);
typedef void (^SPStorageDidSaveCallback)(NSSet *inserted, NSSet *updated);

#pragma mark ====================================================================================
#pragma mark SPStorageObserverAdapter
#pragma mark ====================================================================================

// Note: This class was designed only for Unit Testing purposes. By all means, do *NOT* use this in live code.
@interface SPStorageObserverAdapter : NSObject <SPStorageObserver>
@property (nonatomic, copy) SPStorageObserverCallback willSaveCallback;
@property (nonatomic, copy) SPStorageObserverCallback didSaveCallback;
@property (nonatomic, copy) SPStorageWillSaveCallback willSaveCallback;
@property (nonatomic, copy) SPStorageDidSaveCallback didSaveCallback;
@end
8 changes: 4 additions & 4 deletions SimperiumTests/SPStorageObserverAdapter.m
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,18 @@

@implementation SPStorageObserverAdapter

- (void)storageWillSave:(id<SPStorageProvider>)storage
- (void)storageWillSave:(id<SPStorageProvider>)storage deletedObjects:(NSSet *)deletedObjects
{
if (self.willSaveCallback) {
self.willSaveCallback(storage.insertedObjects, storage.updatedObjects, storage.deletedObjects);
self.willSaveCallback(deletedObjects);
}

}

- (void)storageDidSave:(id<SPStorageProvider>)storage
- (void)storageDidSave:(id<SPStorageProvider>)storage insertedObjects:(NSSet *)insertedObjects updatedObjects:(NSSet *)updatedObjects
{
if (self.didSaveCallback) {
self.didSaveCallback(storage.insertedObjects, storage.updatedObjects, storage.deletedObjects);
self.didSaveCallback(insertedObjects, updatedObjects);
}
}

Expand Down

0 comments on commit 2f0afe4

Please sign in to comment.