diff --git a/.travis.yml b/.travis.yml index a8d776d77..07018ee48 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,4 +8,4 @@ before_script: script: - cd ./Testing/Xcode-desktop - pod update - - xctool -workspace YapDatabaseTesting.xcworkspace -scheme YapDatabaseTesting -sdk macosx -arch x86_64 test + - xctool -workspace YapDatabaseTesting.xcworkspace -scheme YapDatabaseTesting -sdk macosx -arch x86_64 run-tests diff --git a/YapDatabase/Extensions/CrossProcessNotification/YapDatabaseCrossProcessNotification.m b/YapDatabase/Extensions/CrossProcessNotification/YapDatabaseCrossProcessNotification.m index 172f11a15..3ce9e843c 100644 --- a/YapDatabase/Extensions/CrossProcessNotification/YapDatabaseCrossProcessNotification.m +++ b/YapDatabase/Extensions/CrossProcessNotification/YapDatabaseCrossProcessNotification.m @@ -62,6 +62,7 @@ - (id)initWithIdentifier:(NSString *)identifier { self = [super init]; if (self) { self.identifier = identifier; + notifyToken = NOTIFY_TOKEN_INVALID; } return self; } @@ -80,6 +81,7 @@ - (void)start { __weak YapDatabaseCrossProcessNotification* wSelf = self; notify_register_dispatch(name, ¬ifyToken, dispatch_get_main_queue(), ^(int token) { + uint64_t fromPid; notify_get_state(token, &fromPid); BOOL isExternal = fromPid != currentPid(); @@ -96,7 +98,7 @@ - (void)stop { if (notify_is_valid_token(notifyToken)) { notify_cancel(notifyToken); - notifyToken = 0; + notifyToken = NOTIFY_TOKEN_INVALID; } } @@ -110,10 +112,24 @@ - (void)stop { * This method is invoked within the writeQueue. * So either don't do anything expensive/time-consuming in this method, or dispatch_async to do it in another queue. **/ -- (void)didRegisterExtension +- (void)didRegisterExtension { + // only start dispatching notifications once the extension is registered to a database + [self start]; +} + +- (void)noteCommittedChangeset:(NSDictionary *)changeset registeredName:(NSString *)extName { - // only start dispatching notifications once the extension is registered to a database - [self start]; + NSDictionary *ext_changeset = [[changeset objectForKey:YapDatabaseExtensionsKey] objectForKey:extName]; + if (ext_changeset) + { + [self processChangeset:ext_changeset]; + } + + NSNotification *notification = changeset[YapDatabaseNotificationKey]; + if ([notification.name isEqualToString:YapDatabaseModifiedNotification]) + { + [self notifyChanged]; + } } - (YapDatabaseExtensionConnection *)newConnection:(YapDatabaseConnection *)databaseConnection @@ -122,6 +138,9 @@ - (YapDatabaseExtensionConnection *)newConnection:(YapDatabaseConnection *)datab } - (void)notifyChanged { + if (!notify_is_valid_token(notifyToken)) { + [self start]; + } const char* name = [[self channel] cStringUsingEncoding:NSUTF8StringEncoding]; diff --git a/YapDatabase/Extensions/CrossProcessNotification/YapDatabaseCrossProcessNotificationTransaction.m b/YapDatabase/Extensions/CrossProcessNotification/YapDatabaseCrossProcessNotificationTransaction.m index dcd3c7698..acee24b32 100644 --- a/YapDatabase/Extensions/CrossProcessNotification/YapDatabaseCrossProcessNotificationTransaction.m +++ b/YapDatabase/Extensions/CrossProcessNotification/YapDatabaseCrossProcessNotificationTransaction.m @@ -26,7 +26,6 @@ @interface YapDatabaseCrossProcessNotificationTransaction () @property (nonatomic, strong) YapDatabaseCrossProcessNotificationConnection* parentConnection; @property (nonatomic, strong) YapDatabaseReadTransaction* databaseTransaction; -@property (nonatomic, assign) BOOL anyChange; @end @@ -37,7 +36,6 @@ - (id)initWithParentConnection:(YapDatabaseCrossProcessNotificationConnection *) { if ((self = [super init])) { - self.anyChange = NO; self.parentConnection = inParentConnection; self.databaseTransaction = inDatabaseTransaction; } @@ -104,14 +102,6 @@ - (YapDatabaseExtensionConnection *)extensionConnection **/ - (void)didCommitTransaction { - if (self.anyChange) - { - YapDatabaseCrossProcessNotification *ext = - (YapDatabaseCrossProcessNotification *)self.parentConnection.extension; - - [ext notifyChanged]; - } - // An extensionTransaction is only valid within the scope of its encompassing databaseTransaction. // I imagine this may occasionally be misunderstood, and developers may attempt to store the extension in an ivar, // and then use it outside the context of the database transaction block. @@ -126,7 +116,6 @@ - (void)didCommitTransaction **/ - (void)didRollbackTransaction { - self.anyChange = NO; // An extensionTransaction is only valid within the scope of its encompassing databaseTransaction. // I imagine this may occasionally be misunderstood, and developers may attempt to store the extension in an ivar, // and then use it outside the context of the database transaction block. @@ -149,7 +138,7 @@ - (void)didInsertObject:(id)object withMetadata:(id)metadata rowid:(int64_t)rowid { - self.anyChange = YES; + } /** @@ -161,7 +150,7 @@ - (void)didUpdateObject:(id)object withMetadata:(id)metadata rowid:(int64_t)rowid { - self.anyChange = YES; + } /** @@ -170,7 +159,7 @@ - (void)didUpdateObject:(id)object **/ - (void)didReplaceObject:(id)object forCollectionKey:(YapCollectionKey *)collectionKey withRowid:(int64_t)rowid { - self.anyChange = YES; + } /** @@ -179,7 +168,7 @@ - (void)didReplaceObject:(id)object forCollectionKey:(YapCollectionKey *)collect **/ - (void)didReplaceMetadata:(id)metadata forCollectionKey:(YapCollectionKey *)collectionKey withRowid:(int64_t)rowid { - self.anyChange = YES; + } /** @@ -188,7 +177,7 @@ - (void)didReplaceMetadata:(id)metadata forCollectionKey:(YapCollectionKey *)col **/ - (void)didTouchObjectForCollectionKey:(YapCollectionKey __unused *)collectionKey withRowid:(int64_t __unused)rowid { - self.anyChange = YES; + } /** @@ -197,7 +186,7 @@ - (void)didTouchObjectForCollectionKey:(YapCollectionKey __unused *)collectionKe **/ - (void)didTouchMetadataForCollectionKey:(YapCollectionKey __unused *)collectionKey withRowid:(int64_t __unused)rowid { - self.anyChange = YES; + } /** @@ -206,7 +195,7 @@ - (void)didTouchMetadataForCollectionKey:(YapCollectionKey __unused *)collection **/ - (void)didTouchRowForCollectionKey:(YapCollectionKey *)collectionKey withRowid:(int64_t)rowid { - self.anyChange = YES; + } /** @@ -215,7 +204,7 @@ - (void)didTouchRowForCollectionKey:(YapCollectionKey *)collectionKey withRowid: **/ - (void)didRemoveObjectForCollectionKey:(YapCollectionKey *)collectionKey withRowid:(int64_t)rowid { - self.anyChange = YES; + } /** @@ -224,7 +213,7 @@ - (void)didRemoveObjectForCollectionKey:(YapCollectionKey *)collectionKey withRo **/ - (void)didRemoveObjectsForKeys:(NSArray __unused *)keys inCollection:(NSString *)collection withRowids:(NSArray *)rowids { - self.anyChange = YES; + } /** @@ -233,7 +222,7 @@ - (void)didRemoveObjectsForKeys:(NSArray __unused *)keys inCollection:(NSString **/ - (void)didRemoveAllObjectsInAllCollections { - self.anyChange = YES; + } @end