3

ここ数週間、私はRestkit(v0.10.0)とコアデータを学び、これらの優れたツールで可能性は無限に広がります。問題は、ここで全体像を見る方法に少し圧倒されていることです。また、Restkitの更新のペースが非常に速いため、ほとんどのチュートリアル/デモコードは古く、正しく機能しなくなりました。

リモートサーバー上のjsonからのデータでテーブルビューを埋めることができました。キャッシュと組み合わせてリモートデータをリードする方法も検討しましたが、NSManagedObjectContext / NSEntityDescription(コアデータ)と、POSTコマンドを使用した場合のRestkitでの動作に苦労しています。

私が正しく理解していれば、レコードはCore Dataで作成され(コメント行の後//新しいインスタンスを作成します)、その後、そのデータを使用してPOSTリクエストが作成され、レコードがサーバーに投稿されます。

このコードはサーバー上に新しいレコードを作成するために使用されていますが、コードが実行されると(サーバー上にレコードが作成されているのがわかります)、それに応じてテーブルビューが更新されないため、テーブルビューは更新されないため、新しいレコードは次のようになります。アプリを再起動すると最初に表示されます。サーバーからデータを手動で更新することも役に立ちません。

うまくいけば、誰かが私にいくつかのポインタ、またはおそらくRestkit/コアデータとPOSTを組み合わせたチュートリアルを教えてくれるでしょう。ありがとう!

- (void)createGoalWithName:(NSString *)name andDescription:(NSString *)goalDescription
{
    Goal* goal = [Goal object];
    goal.identifier = 0;
    goal.name = name;
    goal.goalDescription = goalDescription;

    // Create a new instance of the entity managed by the fetched results controller.
    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
    NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
    [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];

    [self saveContext];

    [[RKObjectManager sharedManager].router routeClass:[Goal class] toResourcePath:@"/api/goals" forMethod:RKRequestMethodPOST];

    [[RKObjectManager sharedManager] postObject:goal delegate:self];

    [self.tableView reloadData];
}

- (void)saveContext {
    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
    NSError *error = nil;
    if (![context save:&error]) {
    /*
     Replace this implementation with code to handle the error appropriately.

     abort() causes the application to generate a crash log and terminate. 

     You should not use this function in a shipping application, 
     although it may be useful during development. 

     If it is not possible to recover from the error, 
     display an alert panel that instructs the user to quit the application by pressing the Home button.
     */
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}
4

3 に答える 3

2

RestKit+CoreData を使用する場合はブロックを使用する必要があり、ルーターの設定は忘れてください。

NSString *postUrl = @"/someurl/newelement";    
[ [RKObjectManager sharedManager] loadObjectsAtResourcePath:postUrl usingBlock:^(RKObjectLoader* loader) {
    loader.serializationMIMEType = RKMIMETypeJSON;

    loader.delegate = nil;
    loader.targetObject = nil;
    loader.method= RKRequestMethodPOST; // change to GET, POST, PUT etc
}];
于 2012-07-16T11:31:56.103 に答える
1

UI コードが含まれていないため、この問題を完全に診断することは困難ですが、アプリを再起動したときに更新が表示されるために発生する可能性のあることの 1 つは、さまざまなスレッド間で変更を適切に同期していないことです。ローカル管理オブジェクト コンテキスト。RestKit はメイン UI スレッドで実行されないため、独自のマネージド オブジェクト コンテキストがあります。

Core Data で複数のスレッドを操作するという概念は、この Apple ドキュメントで説明されています: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/CoreData/Articles/cdConcurrency.html RestKit スレッドで行われた変更を安全にマージするには、通知を登録してからUI スレッドのマネージド オブジェクト コンテキストをNSManagedObjectContextDidSaveNotification呼び出す必要があります。mergeChangesFromContextDidSaveNotification:

通知は RestKit スレッドに投稿されることに注意してください。そのため、おそらくメイン UI スレッドで更新を実行する必要があります。たとえば、通知を受け取るメソッドで次のようにします。

[self.managedObjectContextForMainThread performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) withObject:notification waitUntilDone:YES];

NSManagedObjectContext* managedObjectContextForMainThreadUI スレッドのマネージド オブジェクト コンテキストを指すようにプロパティが適切に初期化されている場所。

これが役に立てば幸いです(RestKitを完全に放棄していない場合...)

于 2012-11-01T16:52:10.130 に答える
0

少し古いバージョンのRestkitをまだ使用しています。ただし、重要な要素の 1 つは、主キー属性を定義する必要があることです。Restkit がローカルに保存されたオブジェクトとサーバー オブジェクトの同期を維持できるようにします。

あなたの場合、Goal オブジェクトのマッピングを定義するときは、次のようにします: goalMapping.primaryKeyAttribute = @"identifier";

于 2012-06-02T07:37:00.373 に答える