2014-05-23 7 views
0

한다고 가정 나는이 같은 모델이 멋지게 플레이를 할 수 방법 : 당신이 볼 수 있듯이YapDatabase과 맨틀 직렬화

#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"] 

할 수 있지만,이 오류의 결과로, 내 사용자 정의 JSONKeyPathsByPropertyKey 방법에도 불구하고 anotherProp를 직렬화하려고 시도 :

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

내가 사용하는 YapDatabase을 얻을 수있는 사용자 지정 serializer를 작성해야합니까 JSONKeyPathsByPropertyKey?

답변

0

다음은이는 시리얼 또는 아무것도없이 "그냥 작동"만들기에 MTLModel 확장자를 사용하여 내 현재의 접근 방식입니다. 시리얼 라이저 구현이나 더 나은 것이 있다면 알려주세요. 내가 명시 적 속성을 하위 클래스 모든 모델에 propertyKeysToExcludeInDictionaryValue을 재정 의하여 직렬화 할 필요가 없습니다하는 설정할 수 있습니다,이 코드

// JSONEncodableMTLModel.h 
#import <Foundation/Foundation.h> 
#import "Mantle.h" 

@interface JSONEncodableMTLModel : MTLModel <MTLJSONSerializing>  
+ (NSSet*)propertyKeysToExcludeInDictionaryValue; 
@end 

// JSONEncodableMTLModel.m 
#import "JSONEncodableMTLModel.h" 
#import <objc/runtime.h> 

@implementation JSONEncodableMTLModel 

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

+ (NSSet*)propertyKeysToExcludeInDictionaryValue 
{ 
    return [NSSet set]; 
} 

// this is required to ensure we don't have cyclical references when including the parent variable. 
+ (NSSet *)propertyKeys { 
    NSSet *cachedKeys = objc_getAssociatedObject(self, HSModelCachedPropertyKeysKey); 
    if (cachedKeys != nil) return cachedKeys; 

    NSMutableSet *keys = [NSMutableSet setWithSet:[super propertyKeys]]; 

    NSSet *exclusionKeys = [self propertyKeysToExcludeInDictionaryValue]; 
    NSLog(@"Caching Your Property Keys"); 
    [exclusionKeys enumerateObjectsUsingBlock:^(NSString *propertyKey, BOOL *stop) { 
     if([keys containsObject: propertyKey]) 
     { 
      [keys removeObject: propertyKey]; 
     } 
    }]; 

    // It doesn't really matter if we replace another thread's work, since we do 
    // it atomically and the result should be the same. 
    objc_setAssociatedObject(self, HSModelCachedPropertyKeysKey, [keys copy], OBJC_ASSOCIATION_COPY); 

    return keys; 
} 

@end 

: 그렇지 않으면,이 코드는 생명의 은인이다. 크레딧은 Stephen O'Connor입니다.

1

Mantle을 사용하려면 YapDatabase를 구성해야합니다. 기본적으로 NSCoding을 사용합니다. (따라서 "encodeWithCoder :"에 대한 오류가 NSCoding의 일부이므로 해당 메서드가 NSCoding에 포함되어 있습니다.)

YapDatabase의 wiki 기사 인 "Storing Objects"에서 직렬화기를 사용하는 방법에 대해 설명합니다/디시리얼라이저 블록 : 기본적으로 https://github.com/yaptv/YapDatabase/wiki/Storing-Objects

, 당신은/ALLOC 당신의 YapDatabase 인스턴스를 초기화하기 때, 당신은 직렬화/역 직렬화를 수행하기 위해 맨틀을 사용하는 시리얼 & 디시리얼라이저 블록을 전달할 수 있습니다.

또한, YapDatabase에 사용할 수있는 다양한 초기화 방법을 참조하십시오 https://github.com/yaptv/YapDatabase/blob/master/YapDatabase/YapDatabase.h

+0

예, 맞춤 직렬 변환기가 필요할 수도 있습니다. 내가 상자 또는 밖으로 일하는 그런 serializer/deserializer의 구현을 찾고 있는데요. 적어도 JSONKeyPathsByPropertyKey를 사용할 수있게 해주는 접근 방식입니다. – ccwasden