I'm trying to use Mantle and Core Data to build a client for reddit but I keep getting *** Caught exception setting key "upvotes" : [<Thread 0x14c61ba10> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key upvotes. thrown and I can't figure out what's wrong...
I don't think I've missed out anything from the Mantle docs.
Thread+CoreDataProperties.h
#import "Thread.h"
NS_ASSUME_NONNULL_BEGIN
@interface Thread (CoreDataProperties)
@property (nullable, nonatomic, retain) NSString *approvedBy;
@property (nullable, nonatomic, retain) NSNumber *isArchived;
@property (nullable, nonatomic, retain) NSString *author;
@property (nullable, nonatomic, retain) NSString *title;
@property (nullable, nonatomic, retain) NSDate *createdDate;
@property (nullable, nonatomic, retain) NSString *subreddit;
@property (nullable, nonatomic, retain) NSString *domain;
@property (nullable, nonatomic, retain) NSNumber *upvotes;
@end
NS_ASSUME_NONNULL_END
Thread+CoreDataProperties.m
#import "Thread+CoreDataProperties.h"
@implementation Thread (CoreDataProperties)
@dynamic approvedBy;
@dynamic isArchived;
@dynamic author;
@dynamic title;
@dynamic createdDate;
@dynamic subreddit;
@dynamic domain;
@dynamic upvotes;
@end
Thread.h
@import Foundation;
@import CoreData;
@import Mantle;
@import MTLManagedObjectAdapter;
NS_ASSUME_NONNULL_BEGIN
@interface Thread : MTLModel <MTLJSONSerializing, MTLManagedObjectSerializing>
// Insert code here to declare functionality of your managed object subclass
@end
NS_ASSUME_NONNULL_END
#import "Thread+CoreDataProperties.h"
Thread.m
#import "Thread.h"
#import <Mantle/MTLValueTransformer.h>
@implementation Thread
#pragma mark MTLManagedObjectSerializing Protocols
+ (NSString *)managedObjectEntityName
{
return @"Thread";
}
+ (NSDictionary *)managedObjectKeysByPropertyKey
{
return @{
@"approvedBy": @"approvedBy",
@"isArchived": @"isArchived",
@"author": @"author",
@"title": @"title",
@"createdDate": @"createdDate",
@"subreddit": @"subreddit",
@"domain": @"domain",
@"upvotes": @"upvotes"
};
}
+ (NSSet *)propertyKeysForManagedObjectUniquing {
return [NSSet setWithObjects:@"approvedBy",@"isArchived",@"author",@"title",@"createdDate",@"subreddit",@"domain",@"upvotes", nil];
}
#pragma mark MTLJSONSerializing Protocols
+ (NSDictionary *)JSONKeyPathsByPropertyKey {
return @{
@"approvedBy": @"approved_by",
@"isArchived": @"archived",
// @"author": @"author",
// @"title": @"title",
@"createdDate": @"created",
// @"subreddit": @"subreddit",
// @"domain": @"domain",
@"upvotes": @"ups"
};
}
+ (NSValueTransformer *)JSONTransformerForKey:(NSString *)key {
if ([key isEqualToString:@"createdDate"]) {
return [Thread dateJSONTransformer];
}
return nil;
}
+ (NSValueTransformer *)dateJSONTransformer {
return [MTLValueTransformer transformerUsingForwardBlock:^id(NSNumber *unixTimestamp, BOOL *success, NSError *__autoreleasing *error) {
return [NSDate dateWithTimeIntervalSince1970:unixTimestamp.doubleValue];
} reverseBlock:^id(NSDate *date, BOOL *success, NSError *__autoreleasing *error) {
return [NSNumber numberWithDouble:[date timeIntervalSince1970]];
}];
}
@end
I can't see how your declaration of
Threadclass relates toNSManagedObject. You've re-declared it asMTLModel, which is subclass ofNSObject. Of course it have noupvotesor any other property defined inCoreDataPropertiescategory since those properties are dynamic, and there will be no Core Data runtime support to provide implementation for them.You should undo that change to
Thread.h, or just delete those four files and recreate them with Xcode.And about Mantle: I don't think that it directly supports Core Data. See here.