0

そのため、RestKit 0.2 と CoreData を使用するように切り替えましたが、マッピングを正しく行うのに苦労しました...理由がわかりません。私のサーバーの JSON 応答は次のようになります。

{
"meta": 
   {
   "limit": 20, 
   "next": null, 
   "offset": 0, 
   "previous": null, 
   "total_count": 2
   }, 
   "objects": 
   [{
       "creation_date": "2012-10-15T20:16:47", 
       "description": "", 
       "id": 1, 
       "last_modified": 
       "2012-10-15T20:16:47", 
       "order": 1, 
       "other_names": "", 
       "primary_name": "Mixing",
       "production_line": "/api/rest/productionlines/1/", 
       "resource_uri": "/api/rest/cells/1/"
   }, 
   {
       "creation_date": "2012-10-15T20:16:47", 
       "description": "",
       "id": 2, 
       "last_modified": "2012-10-15T20:16:47",
       "order": 2, "other_names": "", 
       "primary_name": "Packaging", 
       "production_line": "/api/rest/productionlines/1/",
       "resource_uri": "/api/rest/cells/2/"
   }]
}

次に、XCodeには次のものがあります。

RKObjectManager *objectManager = [RKObjectManager sharedManager];

[AFNetworkActivityIndicatorManager sharedManager].enabled = YES;

NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];
objectManager.managedObjectStore = managedObjectStore;


RKEntityMapping *cellMapping = [RKEntityMapping mappingForEntityForName:@"Cell" inManagedObjectStore:managedObjectStore];
cellMapping.primaryKeyAttribute = @"identifier";
[cellMapping addAttributeMappingsFromDictionary:@{
 @"id": @"identifier",
 @"primary_name": @"primaryName",
 }];



RKResponseDescriptor *responseCell = [RKResponseDescriptor responseDescriptorWithMapping:cellMapping
                                                                             pathPattern:@"/api/rest/cells/?format=json"
                                                                                 keyPath:@"objects"
                                                                             statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];


[objectManager addResponseDescriptorsFromArray:@[responseCell, responseUser, responseCompany]];


[managedObjectStore createPersistentStoreCoordinator];
NSString *storePath = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"AppDB.sqlite"];
NSString *seedPath = [[NSBundle mainBundle] pathForResource:@"SeedDatabase" ofType:@"sqlite"];
NSError *error;
NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:storePath fromSeedDatabaseAtPath:seedPath withConfiguration:nil options:nil error:&error];
NSAssert(persistentStore, @"Failed to add persistent store with error: %@", error);

// Create the managed object contexts
[managedObjectStore createManagedObjectContexts];

// Configure a managed object cache to ensure we do not create duplicate objects
managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectStore.persistentStoreManagedObjectContext];

私の要求は:

    [[RKObjectManager sharedManager] getObjectsAtPath:@"/api/rest/cells/?format=json" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
        RKLogInfo(@"Load complete: Table should refresh...");

        [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:@"LastUpdatedAt"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        RKLogError(@"Load failed with error: %@", error);
    }];

そして、私は常に次のエラーが発生します。

**Error Domain=org.restkit.RestKit.ErrorDomain Code=1001 "Unable to find any mappings for the given content" UserInfo=0x1102d500 {DetailedErrors=(), NSLocalizedDescription=Unable to find any mappings for the given content, keyPath=null}**

どうもありがとう!

更新: cellMapping.forceCollectionMapping = YES; を追加しました。しかし、まだ運がありません:(!

更新 #2 : ブレイクのアドバイスに従って、パスを変更しようとしましたが、うまくいきました! /api/rest/cells/?format=json の代わりに /api/rest/cells/ を実行すると、サーバーからすべてが返され、マッピングが成功しました!

今私が得る唯一の問題は、次のエラーです:

2012-11-21 14:48:49.414 App[3125:617] W restkit.object_mapping:RKMapperOperation.m:176 コレクション マッピングが強制されましたが、マッピング可能なオブジェクトの型は NSDictionary ではなく '__NSCFArray' です

4

2 に答える 2

4

応答記述子が要求されたURLと一致していないようです。2つのアイデア:

  1. パスパターンを完全に削除し(nilで渡す)、「セル」でキーパスベースの一致を使用してみてください
  2. '/ api / rest/cells'のパスパターンを使用してみてください

次に試すのは、デバッガーを使用してマッチングをステップ実行することです。候補応答のリスト内でRKObjectManager、マッピングはRKFilteredArrayOfResponseDescriptorsMatchingPath関数によって作成されます。期待される応答マッピングがそこに返されない場合は、要求パスからパスパターンへの評価に失敗しています。

そこで問題がなければ、次に不一致が発生する可能性があるのはメソッドRKResponseMapperOperation内です。buildResponseMappingsDictionaryこのメソッドは、各応答記述子に対して応答を評価します。応答が応答記述子と一致しない場合は、ここで予期しない結果が得られます。

最後に確認する場所は、RKResponseMapperOperation内です。これにより、一致した記述子からマッピングが取得され、それらが適用されます。RKMapperOperationmainメソッドには、期待する逆シリアル化された応答と、mappingsDictionaryプロパティの適切なマッピングが含まれている必要があります。

于 2012-11-21T15:25:42.233 に答える
0

設定が正しいように見えても、マッピングが間違っています。マッピングが呼び出している情報は、指定されたオブジェクト内にネストされているため、オブジェクト内の値を検索するようにマッピングに指示する必要があります。

RKEntityMapping *cellMapping = [RKEntityMapping mappingForEntityForName:@"Cell" inManagedObjectStore:managedObjectStore];
cellMapping.primaryKeyAttribute = @"identifier";

[cellMapping mapKeyOfNestedDictionaryToAttribute:@"objects"];
[cellMapping mapFromKeyPath:@".id" toAttribute:"identifier"];
[cellMapping mapFromKeyPath:@"primary_name" toAttribute:"primaryName"];

詳細については、RKObjectMapping リファレンスを確認してください。

于 2012-11-18T22:56:48.353 に答える