3

私はRestKitを使用するプロジェクトに参加しています。0.10.0にアップグレードすることを決定するまで、0.9.2バージョンを使用していました。新しいバージョンのRestKitと互換性を持たせるためにコードを少し変更した後、loadObjectsAtResourcePath:usingBlock:を使用するとエラーが見つかりました。関数-(void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objectsを使用してデリゲートで応答を受信すると、オブジェクトの配列には正しいオブジェクトが含まれますが、coreDataのキャッシュに保存されません。coreDataへのフェッチを使用してアクセスしようとしても、見つかりません。ここに私が使用するいくつかのコードがあります:

RestKitの構成:

RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:[NSURL URLWithString:@"http://myweb.com/web/app.php/ws"]];
objectManager.client.requestQueue.showsNetworkActivityIndicatorWhenBusy = NO;
objectManager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"db.sqlite"];

    RKManagedObjectMapping* boAccount    = [RKManagedObjectMapping mappingForClass:[BOAccount class] inManagedObjectStore:objectManager.objectStore];
boAccount.primaryKeyAttribute        = @"boAccountID";
[boAccount mapKeyPathsToAttributes:  @"id", @"boAccountID",
                                     @"created_at", @"createDate",
                                     @"date_expiration", @"expirationDate",
                                     @"date_billing", @"billingDate",
                                     @"nb_authorized_devices", @"numberOfAuthorizedDevices",
 nil];
[objectManager.mappingProvider addObjectMapping:boAccount];
[objectManager.mappingProvider setMapping:boAccount forKeyPath:@"account"];

loadObjectsAtResourcePathをロードするための呼び出し:usingBlock:

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/connection" usingBlock:^(RKObjectLoader *loader){
    RKParams *params= [RKParams params];

    //[params setValue:_password.text forParam:@"password"]; 
    [params setValue:[Encrypt encryptWithPublicKeyMessage:_password.text] forParam:@"password"];
    [params setValue:_email.text forParam:@"email"];
    [params setValue:udid forParam:@"udid"];
    [params setValue:name forParam:@"name"];

    loader.delegate = self;
    loader.params= params;
    loader.method= RKRequestMethodPOST;

} ];

-(void)objectLoaderDidFinishLoading:(RKObjectLoader *)objectLoader {

BOAccount* account;
NSArray* accounts = [BOAccount allObjects];
account = [accounts objectAtIndex:0];

}

しかし、アレイアカウントは空です。-(void)objectLoaderDidFinishLoading:(RKObjectLoader *)objectLoader {も試しましたが、同じ結果が得られます。配列オブジェクトを使用して必要なオブジェクトを取得できることはわかっていますが、プロジェクトのDBにオブジェクトを含める必要があります。objectLoaderDidFinishLoadingの配列オブジェクトが表示され、すべてが正しいので、オブジェクトが適切に解析されていることがわかります。

誰が何が起こっているのか知っていますか?アップデート前は、この機能は正しく機能しています。

更新:シミュレーターまたはiPadからアプリケーションを削除すると、次回は動作することがあることがわかりました...それはフィンの答えに役立つと思いました。RestKitがアイテムをキャッシュに入れる前にアイテムを使おうとすることはできますか?

4

1 に答える 1

3

オブジェクトを手動でCoreDataのデータベースに保存する必要があります。

    loader.onDidLoadObjects = ^(NSArray *objects) {
        // Save:
        NSError* error = nil;
        [[RKObjectManager sharedManager].objectStore.managedObjectContextForCurrentThread save:&error];
        if (error) {
            NSLog(@"Save error: %@", error);
        }
     }
于 2012-07-18T14:15:09.210 に答える