8

プロジェクトにRestKitを使用していますが、(elementToPropertyMappings)ですべてのマッピングを制御できるメソッドがクラスにないことに気付きました。したがって、新しいコードを配置するのに最適な場所はどこにあるのか疑問に思いました。現在、私はビューコントローラでそれを行いますが、コードの他の領域で同じマッピングのほとんどを使用するので、それを配置するためのより効率的な場所があります:

私が参照しているコードは次のとおりです。

RKObjectMapping* userMapping = [RKObjectMapping mappingForClass:[User class]];
[userMapping mapKeyPath:@"id" toAttribute:@"identifier"];
[userMapping mapKeyPath:@"forename" toAttribute:@"forename"];
[userMapping mapKeyPath:@"surname" toAttribute:@"surname"];
[userMapping mapKeyPath:@"email" toAttribute:@"email"];
[userMapping mapKeyPath:@"twitter_username" toAttribute:@"twitterUsername"];
[userMapping mapKeyPath:@"created" toAttribute:@"created"];
[userMapping mapKeyPath:@"use_gravatar" toAttribute:@"useGravatar"];
[userMapping mapKeyPath:@"avatar_url" toAttribute:@"avatarURL"];
[userMapping mapKeyPath:@"gender" toAttribute:@"gender"];
[[RKObjectManager sharedManager].mappingProvider setMapping:userMapping forKeyPath:@"user"];

これがUserクラスのメソッドにあり、これらのマッピングなどを設定するために呼び出すことができれば素晴らしいと思います。

どうもありがとう

4

3 に答える 3

9

現在推奨されているマッピングを整理するための良い方法がいくつかあります。

  1. すべてのマッピングをアプリデリゲートに配置し、アプリの初期化時に構成します。これにより、それらがコントローラーから除外され、マッピングの数が少ない場合に役立ちます。
  2. RKObjectMappingProviderをサブクラス化し、サブクラスのinitメソッドですべてのマッピングを構築してから、マッピングプロバイダーインスタンスをインスタンス化してオブジェクトマネージャーに割り当てます。
  3. 'defineMappings'のようなメソッドを使用して、RKObjectMappingProviderにカテゴリを追加します。次に、ヘッダーをアプリデリゲートにインポートし、RestKitを初期化した後、[mappingProviderdefineMappings]を介してヘッダーを呼び出します。

クラスメソッドでマッピングを定義する際の問題は、関係がある場合、インスタンスを格納するために使用できるivarがないため、循環依存になってしまう可能性があることです。この問題を軽減するためにブロックを使って何かを行うことができるかもしれませんが、そのような作業はまだ行われていません。

于 2011-08-25T13:25:44.660 に答える
3

マッピングについて知っておくべきは、ドメインモデルだけだと思います。これが私がいくつかのflickrjsonをマッピングする方法です:

必要なときにマッピングを呼び出します(AppDelegateまたは必要な場所に配置できます)

// Setup our object mappings
RKObjectMapping *photoMapping = [Photo mapWithMapping:nil];
RKObjectMapping *photosMapping = [Photos mapWithMapping:photoMapping];

そして、これは私のドメインオブジェクトの1つです。マッピングを行うclassMethodが含まれています。

#import "Photos.h"
@implementation Photos

+ (RKObjectMapping*)mapWithMapping: (RKObjectMapping*)aMapping
{
    RKObjectManager *objectManager = [RKObjectManager sharedManager];
    RKManagedObjectMapping *mapping = [RKManagedObjectMapping mappingForClass:[self class] inManagedObjectStore:objectManager.objectStore];

    [mapping mapKeyPathsToAttributes:
         @"page", @"page",
         @"pages", @"pages",
         @"perpage", @"perpage",
         @"stat", @"stat",
         @"total", @"total",
     nil];

    if (aMapping) {
        [mapping mapRelationship:@"photo" withMapping:aMapping];
    }

    return mapping;
}

@end
于 2012-10-15T16:25:08.897 に答える
1

私は通常、アプリのセットアップ中に呼び出すプライベートメソッドをアプリデリゲートに作成します。このメソッドはRKObjectManagerをセットアップし、アプリ全体で使用するすべてのマッピングを構築します。RestKitのサンプルプロジェクトはこれと同じパターンを使用していると思いますので、参考としてぜひチェックしてください。

于 2011-08-25T13:26:18.027 に答える