3

RestKit を使用して JSON エンドポイントと通信しています。エンドポイントは UNIX タイムスタンプを「ミリ秒数」で返します。しかし、RestKit のデフォルト トランスフォーマーは、それが「秒数」であると想定しており、NSDate で間違った値を取得します。

それで私は周りを見回して、カスタム valueTransformer を使用して、タイムスタンプを変換する方法を RestKit に伝える必要があることを発見しました。これが私が持っているコードです。

+ (RKBlockValueTransformer*) timeIntervalInMillisecondsSince1970TwoWayTransformer {

    return [RKBlockValueTransformer valueTransformerWithValidationBlock:^BOOL(__unsafe_unretained Class sourceClass, __unsafe_unretained Class destinationClass) {
        // This transformer handles `NSNumber` <-> `NSDate` transformations
        NSLog(@"checking new transformer");
        return (([sourceClass isSubclassOfClass:[NSNumber class]] && [destinationClass isSubclassOfClass:[NSDate class]]) ||
                ([sourceClass isSubclassOfClass:[NSDate class]] && [destinationClass isSubclassOfClass:[NSNumber class]]));
    } transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, __unsafe_unretained Class outputValueClass, NSError *__autoreleasing *error) {
        NSLog(@"transforming");
        RKValueTransformerTestInputValueIsKindOfClass(inputValue, (@[ [NSNumber class], [NSDate class] ]), error);
        RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, (@[ [NSNumber class], [NSDate class] ]), error);
        if ([outputValueClass isSubclassOfClass:[NSDate class]]) {
            if ([inputValue isKindOfClass:[NSNumber class]]) {
                *outputValue = [NSDate dateWithTimeIntervalSince1970:[inputValue doubleValue] / 1000];
            }
        } else if ([outputValueClass isSubclassOfClass:[NSNumber class]]) {
            *outputValue = @((NSInteger)[inputValue timeIntervalSince1970] * 1000);
        }
        return YES;
    }];
}

次に、このトランスフォーマーを RestKit のデフォルト トランスフォーマーに追加します。

RKValueTransformer* transformer = [self timeIntervalInMillisecondsSince1970TwoWayTransformer];
[[RKValueTransformer defaultValueTransformer] addValueTransformer:transformer];

しかし、私の変圧器は決して呼び出されません。私が書いたNSLogステートメントは決して実行されません!


それで、私はこれを試しました - 次のように attributeMapping にトランスフォーマーを書きます:

RKValueTransformer* transformer = [self timeIntervalInMillisecondsSince1970TwoWayTransformer];
RKAttributeMapping *tokenExpiryMapping = [RKAttributeMapping attributeMappingFromKeyPath:@"access_token_expiration" toKeyPath:@"accessTokenExpirationDate"];
tokenExpiryMapping.valueTransformer = transformer;
[userMapping addPropertyMapping:tokenExpiryMapping];

しかし、これを行うとコードはコンパイルされません。「タイプ 'RKAttributeMapping *' のオブジェクトにプロパティ valueTransformer が見つかりません」と表示されます。私はこれを理解していません。RestKitのドキュメントを含むものを含め、私がインターネットで見たすべての例は同じことを言っています。すべての例valueTransformerは、オブジェクトのプロパティを設定しAttributeMappingます。RestKit Class Referenceでさえ、設定できると言っています。しかし、なぜそれはコンパイルされないのですか?

4

3 に答える 3

2

それで、私は最終的に問題が何であるかを理解することができました。

私のポッドファイルは、RestKit 0.20.3 を使用するように構成されました。そして、RKValueTransformers別のポッドとして追加しました。ただし、RestKit 0.20.3 以前には、独自のバージョンの RKValueTransformer (.h および .m) ファイルが付属しています。RKValueTransformersまた、これらの古いバージョンの RestKit は、新しいライブラリを使用しないため、独自のトランスフォーマーの追加をサポートしていません。

RestKit のバージョンを最新バージョンにアップグレードすると (実際には 0.21.0 より上のものはすべて機能します)、正常に機能し始めました。ポッド RKValueTransformers は、RestKit の依存関係として自動的に追加されるため、追加する必要はありませんでした。

于 2014-11-12T22:55:22.080 に答える
1

リストの最後ではなく最初に追加できるように、insertValueTransformer:atIndex:代わりに使用することを検討してください。addValueTransformer:

于 2014-11-12T22:13:35.807 に答える