Skip to content

Instantly share code, notes, and snippets.

@dodikk
Last active August 29, 2015 14:15
Show Gist options
  • Save dodikk/f1ad75f1522b4979fcb4 to your computer and use it in GitHub Desktop.
Save dodikk/f1ad75f1522b4979fcb4 to your computer and use it in GitHub Desktop.
Import protocol to coredata
-(void)importMessageFromWebSocket:(id<HJMessage>)singleMessage
{
NSPredicate* findExistingMessage =
[NSPredicate predicateWithFormat: @"(identifier == %@) && (conversation.identifier == %@)",
singleMessage.messageId,
singleMessage.roomId];
NSManagedObjectContext* context = [NSManagedObjectContext MR_contextForCurrentThread];
HLJMessage* messageToImport = nil;
HLJMessage* existingMessage = [HLJMessage MR_findFirstWithPredicate: findExistingMessage
inContext: context];
if (nil != existingMessage)
{
messageToImport = existingMessage;
}
else
{
messageToImport = [HLJMessage MR_createEntityInContext: context];
HLJConversation* conversation = [HLJConversation MR_findFirstByAttribute: @"identifier"
withValue: self.conversation.identifier
inContext: context];
[conversation addMessages: messageToImport];
}
// Update fields
{
messageToImport.identifier = singleMessage.messageId;
messageToImport.text = singleMessage.messageText;
messageToImport.timestamp = singleMessage.timestamp;
messageToImport.userName = singleMessage.userId;
messageToImport.read = singleMessage.isAlreadyRead;
}
[context MR_saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error)
{
NSLog(@"websocket message saved");
}];
}
@dodikk
Copy link
Author

dodikk commented Feb 17, 2015

Another take with dedicated queue and context

@interface HLJWebSocketToCoreDataMessageWriter : NSObject

-(instancetype)init NS_UNAVAILABLE;
+(instancetype)new  NS_UNAVAILABLE;


-(instancetype)initWithConversation:(HLJConversation*)conversation
                    coreDataContext:(NSManagedObjectContext*)contextToSaveData
                              queue:(dispatch_queue_t)queue
NS_DESIGNATED_INITIALIZER
NS_REQUIRES_SUPER
__attribute__((nonnull));


// TODO : maybe we should add a callback
-(void)importMessageFromWebSocket:(id<HJMessage>)singleMessage;

@end
@implementation HLJWebSocketToCoreDataMessageWriter
{
    HLJConversation* _conversation;
    NSManagedObjectContext* _contextToSaveData;
    dispatch_queue_t _queue;
}

-(instancetype)initWithConversation:(HLJConversation*)conversation
                    coreDataContext:(NSManagedObjectContext*)contextToSaveData
                              queue:(dispatch_queue_t)queue
{
    NSParameterAssert(nil != conversation);
    NSParameterAssert(nil != contextToSaveData);
    NSParameterAssert(nil != queue);

    self = [super init];
    if (nil == self)
    {
        return nil;
    }

    self->_conversation = conversation;
    self->_contextToSaveData = contextToSaveData;

    return self;
}

-(void)importMessageFromWebSocket:(id<HJMessage>)singleMessage
{
    dispatch_async(self->_queue, ^void()
    {
        [self importMessageFromWebSocketImpl: singleMessage];
    });
}

-(void)importMessageFromWebSocketImpl:(id<HJMessage>)singleMessage
{
    NSPredicate* findExistingMessage =
    [NSPredicate predicateWithFormat: @"(identifier == %@) && (conversation.identifier == %@)",
     singleMessage.messageId,
     singleMessage.roomId];


    NSManagedObjectContext* context = self->_contextToSaveData;

    HLJMessage* messageToImport = nil;
    HLJMessage* existingMessage = [HLJMessage MR_findFirstWithPredicate: findExistingMessage
                                                              inContext: context];
    if (nil != existingMessage)
    {
        messageToImport = existingMessage;
    }
    else
    {
        messageToImport = [HLJMessage MR_createEntityInContext: context];


        HLJConversation* conversation = [HLJConversation MR_findFirstByAttribute: @"identifier"
                                                                       withValue: self->_conversation.identifier
                                                                       inContext: context];
        [conversation addMessagesObject: messageToImport];
    }

    // Update fields
    {
        messageToImport.identifier = singleMessage.messageId;
        messageToImport.text       = singleMessage.messageText;
        messageToImport.timestamp  = @([singleMessage.timestamp timeIntervalSince1970]);
        messageToImport.userName   = singleMessage.userId;
        messageToImport.read       = @(singleMessage.isAlreadyRead);
    }


    [context MR_saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error)
     {
         NSLog(@"websocket message saved");
     }];
}

@end
Initialization
-(void)setupMessageWriter
{
    NSManagedObjectContext* context = [NSManagedObjectContext MR_newContextWithParent: [NSManagedObjectContext MR_rootSavingContext]];

    dispatch_queue_t queue = dispatch_queue_create("Websocket Message to Disk Dumper",  DISPATCH_QUEUE_SERIAL);

    self->_messageWriter = [[HLJWebSocketToCoreDataMessageWriter alloc] initWithConversation: self.conversation
                                                                             coreDataContext: context
                                                                                       queue: queue];
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment