8

RestKit 0.20 で新しい NSManagedObject を作成する最善の方法を知りたいですか? 現在、私のコードは次のようになっています。

#pragma mark - navigation buttons

- (void)createButtonDidTouch
{
    // create new album object    
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    NSManagedObjectContext *parentContext = RKObjectManager.sharedManager.managedObjectStore.mainQueueManagedObjectContext;
    context.parentContext = parentContext;
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Album" inManagedObjectContext:parentContext];
    Album *newAlbum = [[Album alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:context];

    // pass object to create view to manipulate
    AlbumCreateViewController *createViewController = [[AlbumCreateViewController alloc] initWithData:newAlbum];
    createViewController.delegate = self;
    createViewController.managedObjectContext = context;

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:createViewController];
    navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;

    [self presentViewController:navController animated:YES completion:nil];
}

#pragma mark - create view controller delegate

- (void)createViewControllerDidSave:(NSManagedObject *)data
{
    // dismiss the create view controller and POST

    // FIXME: add restkit code to save the object
    NSLog(@"save the object...");

    NSDictionary *userInfo = [KeychainUtility load:@"userInfo"];
    NSString *path = [NSString stringWithFormat:@"/albums/add/%@/%@", userInfo[@"userID"], userInfo[@"apiKey"]];

    [RKObjectManager.sharedManager postObject:data path:path parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
        operation.targetObject = data;
    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        NSLog(@"create album error: %@", error);
    }];

    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void)createViewControllerDidCancel:(NSManagedObject *)data
{
    // dismiss the create view controller

    NSLog(@"delete the object...");
    // FIXME: add restkit code to delete the object

    [self dismissViewControllerAnimated:YES completion:nil];
}

また、このオブジェクトを保存/削除する責任が何であるかを知りたいです。RestKit 経由でサーバーに POST すると、管理対象オブジェクトのコンテキストは保存されますか?

この作成プロセスをキャンセルすることにした場合はどうすればよいですか? このオブジェクトを削除するための推奨される方法は何ですか?

基本的に、RestKit は私のためにどのくらいのことをしているか、何をしていることを確認する必要がありますか。これに関するドキュメントはあまり見つかりませんでした。明確にしたいと思います。

4

2 に答える 2

11

特定のオブジェクトの を初期化するRKManagedObjectRequestOperationと、RestKit はそのオブジェクトの永続的なオブジェクト ID を取得し、オブジェクトが挿入されるコンテキストを親コンテキストとする子管理オブジェクト コンテキストを作成します。その後、操作は HTTP 要求を完了するまで実行し、応答を取得します。

応答が成功し、応答のマッピングが成功した場合 (このプライベートな子コンテキスト内でマッピングが発生することに注意してください)、プライベートな子コンテキストが保存されます。savesToPersistentStore呼び出される保存のタイプは、プロパティの値によって決まります ( http://restkit.org/api/0.20.0/Classes/RKManagedObjectRequestOperation.html#//api/name/savesToPersistentStoreを参照)。

の場合、コンテキストはカテゴリ メソッドYESを介して永続ストアに再帰的に保存されます( http://restkit.org/api/0.20.0/Categories/NSManagedObjectContext+RKAdditions.htmlを参照)。NSManagedObjectContextsaveToPersistentStore

の場合NO、コンテキストはバニラ[NSManagedObjectContext save:] メッセージを介して保存され、変更が親コンテキストに「プッシュ」されます。それらは、保存し直すまで、そのコンテキストに対してローカルのままです。管理対象オブジェクト コンテキストの親子階層は、アプリケーション内で作成する限り可能であることに注意してください。

HTTP 要求が失敗したか、マッピング プロセス中にエラーが発生した場合、プライベート コンテキストは保存されず、操作は失敗したと見なされます。これは、変更が元の MOC に保存されず、オブジェクト グラフが操作開始前の状態のままであることを意味します (ただし、送信されるオブジェクトは、一時的な場合は永続的なオブジェクト ID を持ちますが、まだ保存されていません)。

于 2012-12-06T21:18:16.157 に答える
3

あなたのやり方はうまくいくはずですが(各VCのMOCを毎回呼び出す)、「推奨」されていません。

Apple が提案しているのは、他の Core Data アプリと同様に、「バトンを渡す」スタイルです。

ネストされたコンテキストでは、アプリケーション デリゲートからコンテキストを直接取得するのではなく、コンテキストにアクセスする (1 つのビュー コントローラーから次のビュー コントローラーにコンテキストを渡すことによって) 「バトンを渡す」アプローチを採用することがこれまで以上に重要になります。

ここを参照してください: http://developer.apple.com/library/ios/#releasenotes/DataManagement/RN-CoreData/_index.html

2番目の質問については、すべてが適切にマッピング/セットアップされている場合、RestKitはAPI呼び出しの成功時にコアデータスタックの保存/更新を管理する必要があります.

RKクリエーターのブレイクより:

Core Data オブジェクトを POST または PUT する場合、RK はそのオブジェクトの永続的なオブジェクト ID を取得し、セカンダリ管理オブジェクト コンテキストを作成し、リクエストを起動し、レスポンスをマップします (可能な場合)。応答とマッピングが成功した場合は、savesToPersistentStore の値に基づいて、親コンテキストに保存するか、永続ストア (SQLite など) に保存します。

于 2012-12-06T21:06:20.337 に答える