Mantle with Core Data

Episode #120 | 17 minutes | published on 05/22/2014
Subscribers Only
In this episode we cover a different feature of Mantle, which allows us to serialize our models into Core Data entities. This episode continues where we left off in Episode 116.

Episode Links

  • Base - I use this app to manage SQLite databases and is quite handy for working with Core Data's underlying store
  • Mantle - Mantle's Github page / source code.

Conform to the Protocol

First, on our model we conform to the MTLManagedObjectSerializing protocol. This has 2 required methods, but we'll actually need to implement 3 methods.

#pragma mark - MTLManagedObjectSerializing

+ (NSString *)managedObjectEntityName {
    return @"Episode";
}

+ (NSDictionary *)managedObjectKeysByPropertyKey {
    return @{ };
}

+ (NSValueTransformer *)thumbnailImageUrlEntityAttributeTransformer {
    return [MTLValueTransformer reversibleTransformerWithForwardBlock:^NSString *(NSURL *url) {
        return [url description];
    } reverseBlock:^NSURL *(NSString *urlString) {
        return [NSURL URLWithString:urlString];
    }];
}

+ (NSSet *)propertyKeysForManagedObjectUniquing {
    return [NSSet setWithObject:@"episodeNumber"];
}

This is all we need to enable the feature for our models, including updating the records if they exist already.

Serializing to Core Data

Given the we've converted from a JSON document to our model, we also want to convert that model into an NSManagedObject for saving. We can do this for each record by using the MTLManagedObjectAdapter class:

[self fetchEpisodesWithCompletion:^(NSArray *episodes) {
        NSManagedObjectContext *moc = [self.persistenceController newChildManagedObjectContext];
        [episodes enumerateObjectsUsingBlock:^(Episode *episode, NSUInteger idx, BOOL *stop) {
            NSError *insertError;
            NSManagedObject *mob = [MTLManagedObjectAdapter managedObjectFromModel:episode
                                                              insertingIntoContext:moc
                                                                             error:&insertError];

            if (mob) {
                NSLog(@"Mob: %@", mob);
            } else {
                NSLog(@"ERROR: %@", insertError);
            }
        }];

        NSError *saveError;
        if ([moc save:&saveError]) {
            [self.persistenceController saveContextAndWait:YES completion:^(NSError *error) {
                NSLog(@"Save completed (%@)", error);
            }];
        } else {
            NSLog(@"Error saving: %@", saveError);
        }
    }];
blog comments powered by Disqus