假设我有一个这样的模型:

#import <Mantle/Mantle.h>
#import "MyCustomObject.h"
@interface MyModel : MTLModel <MTLJSONSerializing>
@property (nonatomic, copy, readonly) NSString *UUID;
@property (nonatomic, copy) NSString *someProp;
@property (nonatomic, copy) MyCustomObject *anotherProp;
@end

#import "MyModel.h"
@implementation MyModel
+ (NSDictionary *)JSONKeyPathsByPropertyKey
{
        return @{
            @"UUID": @"id",
            @"anotherProp": NSNull.null
    };
}
}
@end


如您所见,我想在NSCoding序列化期间忽略anotherProp,以及将“ UUID”重新映射为“ id”。使用YapDatabase,我可以

[transaction setObject:myModelObj forKey:@"key_1" inCollection:@"my_collection"]


但尽管使用了我的自定义anotherProp方法,它仍尝试序列化JSONKeyPathsByPropertyKey,导致此错误:

*** Caught exception encoding value for key "anotherProp" on class MyModel: -[YapDatabase encodeWithCoder:]: unrecognized selector sent to instance 0xc989630


我是否需要编写自定义序列化程序以使YapDatabase使用JSONKeyPathsByPropertyKey

最佳答案

您需要配置YapDatabase以使用Mantle。默认情况下,它将使用NSCoding。 (这就是为什么您看到有关“ encodeWithCoder:”的错误的原因,因为该方法是NSCoding的一部分。)

看一下YapDatabase的Wiki文章“存储对象”,其中讨论了它如何使用序列化器/解串器块:
https://github.com/yaptv/YapDatabase/wiki/Storing-Objects

基本上,当您分配/初始化YapDatabase实例时,您将希望传递一个使用Mantle来执行序列化/反序列化的序列化器和反序列化器块。

另外,请参见可用于YapDatabase的各种初始化方法:
https://github.com/yaptv/YapDatabase/blob/master/YapDatabase/YapDatabase.h

09-11 19:14