Skip to content

Commit

Permalink
Merge pull request #37 from ogres/master
Browse files Browse the repository at this point in the history
Multithreading Violation with NSManagedObjectContext
  • Loading branch information
Christoph Krey committed Jun 19, 2015
2 parents bf5bd4b + a23a1f5 commit 5189127
Showing 1 changed file with 35 additions and 27 deletions.
62 changes: 35 additions & 27 deletions MQTTClient/MQTTClient/MQTTPersistence.m
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -72,12 +72,12 @@ - (NSUInteger)windowSize:(NSString *)clientId {
}

- (MQTTFlow *)storeMessageForClientId:(NSString *)clientId
topic:(NSString *)topic
data:(NSData *)data
retainFlag:(BOOL)retainFlag
qos:(MQTTQosLevel)qos
msgId:(UInt16)msgId
incomingFlag:(BOOL)incomingFlag {
topic:(NSString *)topic
data:(NSData *)data
retainFlag:(BOOL)retainFlag
qos:(MQTTQosLevel)qos
msgId:(UInt16)msgId
incomingFlag:(BOOL)incomingFlag {
if (([self allFlowsforClientId:clientId incomingFlag:incomingFlag].count <= self.maxMessages) &&
(fileSize <= self.maxSize)) {
MQTTFlow *flow = [self createFlowforClientId:clientId
Expand All @@ -101,7 +101,9 @@ - (MQTTFlow *)storeMessageForClientId:(NSString *)clientId
}

- (void)deleteFlow:(MQTTFlow *)flow {
[self.managedObjectContext deleteObject:flow];
[self.managedObjectContext performBlockAndWait:^{
[self.managedObjectContext deleteObject:flow];
}];
}

- (void)deleteAllFlowsForClientId:(NSString *)clientId {
Expand All @@ -117,18 +119,20 @@ - (void)deleteAllFlowsForClientId:(NSString *)clientId {
}

- (void)sync {
if (self.managedObjectContext.hasChanges) {
if (DEBUGPERSIST) NSLog(@"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]) {
if (DEBUGPERSIST) NSLog(@"sync %@", error);
[self.managedObjectContext performBlockAndWait:^{
if (self.managedObjectContext.hasChanges) {
if (DEBUGPERSIST) NSLog(@"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]) {
if (DEBUGPERSIST) NSLog(@"sync %@", error);
}
[self sizes];
}
[self sizes];
}
}];
}

- (NSArray *)allFlowsforClientId:(NSString *)clientId
Expand All @@ -140,12 +144,14 @@ - (NSArray *)allFlowsforClientId:(NSString *)clientId
@(incomingFlag)
];
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"deadline" ascending:YES]];

NSError *error = nil;
NSArray *flows = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (!flows) {
if (DEBUGPERSIST) NSLog(@"allFlowsforClientId %@", error);
}
__block NSArray *flows;
[self.managedObjectContext performBlockAndWait:^{
NSError *error = nil;
flows = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (!flows) {
if (DEBUGPERSIST) NSLog(@"allFlowsforClientId %@", error);
}
}];
return flows;
}

Expand All @@ -160,9 +166,11 @@ - (MQTTFlow *)flowforClientId:(NSString *)clientId
@(incomingFlag),
@(messageId)
];
NSError *error = nil;
NSArray *flows = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

__block NSArray *flows;
__block NSError *error = nil;
[self.managedObjectContext performBlockAndWait:^{
flows = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
}];
if (!flows) {
if (DEBUGPERSIST) NSLog(@"flowForClientId %@", error);
} else {
Expand Down

0 comments on commit 5189127

Please sign in to comment.