diff --git a/MQTTClient.podspec b/MQTTClient.podspec index 4b2a9b3d..317f6650 100644 --- a/MQTTClient.podspec +++ b/MQTTClient.podspec @@ -1,13 +1,13 @@ Pod::Spec.new do |mqttc| mqttc.name = "MQTTClient" - mqttc.version = "0.7.4" + mqttc.version = "0.7.5" mqttc.summary = "iOS, OSX and tvOS native ObjectiveC MQTT Client Framework" mqttc.homepage = "https://github.com/ckrey/MQTT-Client-Framework" mqttc.license = { :type => "EPLv1", :file => "LICENSE" } mqttc.author = { "Christoph Krey" => "krey.christoph@gmail.com" } mqttc.source = { :git => "https://github.com/ckrey/MQTT-Client-Framework.git", - :tag => "0.7.4", + :tag => "0.7.5", :submodules => true } diff --git a/MQTTClient/MQTTClient/MQTTCoreDataPersistence.m b/MQTTClient/MQTTClient/MQTTCoreDataPersistence.m index 9d45e357..b3b5591e 100755 --- a/MQTTClient/MQTTClient/MQTTCoreDataPersistence.m +++ b/MQTTClient/MQTTClient/MQTTCoreDataPersistence.m @@ -162,28 +162,6 @@ - (void)setDeadline:(NSDate *)deadline { @end -// Attempt to fix #117 -// -//@interface NSManagedObjectContext ( Recursive ) -//- (void)recursiveSave; -//@end -// -//@implementation NSManagedObjectContext ( Recursive ) -// -//- (void)recursiveSave { -// if (self.hasChanges) { -// NSError *error = nil; -// if (![self save: &error]) { -// DDLogError(@"[MQTTPersistence] sync error %@", error); -// } -// -// if (self.parentContext) { -// [self.parentContext recursiveSave]; -// } -// } -//} -//@end -// @implementation MQTTCoreDataPersistence @synthesize persistent; @synthesize maxSize; @@ -260,28 +238,52 @@ - (void)deleteAllFlowsForClientId:(NSString *)clientId { } - (void)sync { - [self.managedObjectContext performBlockAndWait:^{ + if ([NSThread isMainThread]) { + [self internalSync]; + } else { + [self.managedObjectContext performBlockAndWait:^{ + [self internalSync]; + }]; + } + if ([NSThread isMainThread]) { + [self internalParentSync]; + } else { + [self.managedObjectContext.parentContext performBlockAndWait:^{ + [self internalParentSync]; + }]; + } +} + +- (void)internalSync { + if (self.managedObjectContext.hasChanges) { + DDLogVerbose(@"[MQTTPersistence] pre-sync: i%lu u%lu d%lu", + (unsigned long)self.managedObjectContext.insertedObjects.count, + (unsigned long)self.managedObjectContext.updatedObjects.count, + (unsigned long)self.managedObjectContext.deletedObjects.count + ); + NSError *error = nil; + if (![self.managedObjectContext save:&error]) { + DDLogError(@"[MQTTPersistence] sync error %@", error); + } if (self.managedObjectContext.hasChanges) { - DDLogVerbose(@"[MQTTPersistence] pre-sync: i%lu u%lu d%lu", - (unsigned long)self.managedObjectContext.insertedObjects.count, - (unsigned long)self.managedObjectContext.updatedObjects.count, - (unsigned long)self.managedObjectContext.deletedObjects.count - ); - NSError *error = nil; - if (![self.managedObjectContext save:&error]) { - DDLogError(@"[MQTTPersistence] sync error %@", error); - } - if (self.managedObjectContext.hasChanges) { - DDLogError(@"[MQTTPersistence] sync not complete"); - } - DDLogVerbose(@"[MQTTPersistence] postsync: i%lu u%lu d%lu", - (unsigned long)self.managedObjectContext.insertedObjects.count, - (unsigned long)self.managedObjectContext.updatedObjects.count, - (unsigned long)self.managedObjectContext.deletedObjects.count - ); - [self sizes]; + DDLogError(@"[MQTTPersistence] sync not complete"); } - }]; + DDLogVerbose(@"[MQTTPersistence] postsync: i%lu u%lu d%lu", + (unsigned long)self.managedObjectContext.insertedObjects.count, + (unsigned long)self.managedObjectContext.updatedObjects.count, + (unsigned long)self.managedObjectContext.deletedObjects.count + ); + [self sizes]; + } +} + +- (void)internalParentSync { + if (self.managedObjectContext.parentContext && self.managedObjectContext.parentContext.hasChanges) { + NSError *error = nil; + if (![self.managedObjectContext.parentContext save:&error]) { + DDLogError(@"[MQTTPersistence] parentContext sync error %@", error); + } + } } - (NSArray *)allFlowsforClientId:(NSString *)clientId diff --git a/MQTTClient/MQTTClientTests/MQTTClientPublishTests.m b/MQTTClient/MQTTClientTests/MQTTClientPublishTests.m index 73fbbfc8..078b6ee1 100644 --- a/MQTTClient/MQTTClientTests/MQTTClientPublishTests.m +++ b/MQTTClient/MQTTClientTests/MQTTClientPublishTests.m @@ -63,6 +63,27 @@ - (void)testPublish_r0_q0_zeroLengthPayload { } } +- (void)testPublish_r1_q0_zeroLengthPayload { + for (NSString *broker in self.brokers.allKeys) { + DDLogVerbose(@"testing broker %@", broker); + NSDictionary *parameters = self.brokers[broker]; + [self connect:parameters]; + [self testPublish:[[NSData alloc] init] + onTopic:[NSString stringWithFormat:@"%@/%s", TOPIC, __FUNCTION__] + retain:TRUE + atLevel:0]; + [self testPublish:[@"data" dataUsingEncoding:NSUTF8StringEncoding] + onTopic:[NSString stringWithFormat:@"%@/%s", TOPIC, __FUNCTION__] + retain:TRUE + atLevel:0]; + [self testPublish:[[NSData alloc] init] + onTopic:[NSString stringWithFormat:@"%@/%s", TOPIC, __FUNCTION__] + retain:TRUE + atLevel:0]; + [self shutdown:parameters]; + } +} + - (void)testPublish_r0_q0 { for (NSString *broker in self.brokers.allKeys) { DDLogVerbose(@"testing broker %@", broker); diff --git a/MQTTClient/MQTTClientTests/MQTTTestHelpers.plist b/MQTTClient/MQTTClientTests/MQTTTestHelpers.plist index 17da2387..31681d8c 100644 --- a/MQTTClient/MQTTClientTests/MQTTTestHelpers.plist +++ b/MQTTClient/MQTTClientTests/MQTTTestHelpers.plist @@ -44,6 +44,10 @@ allowUntrustedCertificates + CoreData + + persistent + localWS