【发布时间】:2016-04-01 01:35:15
【问题描述】:
我正在尝试使用 Mantle 和 Core Data 为 reddit 构建客户端,但我不断收到 *** Caught exception setting key "upvotes" : [<Thread 0x14c61ba10> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key upvotes. 抛出,我不知道出了什么问题...
我认为我没有错过 Mantle 文档中的任何内容。
线程+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
【问题讨论】:
-
我不确定 Mantle 是什么,但是,您使用的是正确的模型版本吗?选择您的 .xcdatamodeld 文件,单击 File Inspector,转到 Model Version 并确保您使用的 Model Version 具有包含 upVotes 属性的 Thread 实体。
-
看起来 Mantle 带来的问题多于解决的问题。这比仅在没有框架的情况下匹配属性和属性要详细得多。
-
@Jonathan Mantle 是一个用于为 Cocoa 应用程序(需要处理 RESTful API)编写简单模型层的库。我以前没有处理过模型版本控制,但不太可能是因为这个——我实际上只是在 2 小时内破解了所有代码,而且我还没有进行任何模型版本控制。
-
@Mundi 在大多数情况下,是的。使用 Mantle,我不需要太多 NSCoding 和 NSCopying 协议的样板代码。我实际上已经着手移除 Mantle……但即便如此,我仍然对这种奇怪的行为感到困惑。
标签: ios json cocoa-touch core-data github-mantle