【问题标题】:Mantle + Core Data: this class is not key value coding-compliant for the keyMantle + Core Data:这个类不符合键的键值编码
【发布时间】: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


【解决方案1】:

我看不出您的 Thread 类声明与 NSManagedObject 有何关联。您已将其重新声明为MTLModel,它是NSObject 的子类。当然它没有upvotesCoreDataProperties 类别中定义的任何其他属性,因为这些属性是动态的,并且不会有Core Data 运行时支持来为它们提供实现。

您应该撤消对 Thread.h 的更改,或者只删除这四个文件并使用 Xcode 重新创建它们。

关于 Mantle:我不认为它直接支持 Core Data。见here

【讨论】:

  • Mantle 有一个 adapter(现在与 Mantle 本身解耦)在 MTLModel 实例和 Core Data 托管对象之间进行转换。
  • 那么它显然没有做它应该做的事情:) 也许一些配置错误?您可以通过实例化 Thread 对象来检查它,并查询一些 NSManagedObject 方法,例如 managedObjectContext
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
相关资源
最近更新 更多