2012-12-06 8 views
8

私はRestKit 0.20で新しいNSManagedObjectを作成するのが最善の方法を知りたいのですか?現在、私のコードは次のようなものになります。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は基本的に私にとって何をしているのですか、私は何をしているのかを確認する必要があります。私はこれに関する多くの文書を見つけられておらず、それについて明確にしたいと思います。

答えて

11

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

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

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

NOの場合、コンテキストはバニラ[NSManagedObjectContext save:]メッセージによって保存されます。このメッセージは、変更を親コンテキストにプッシュバックします。あなたがそれらを元に戻すまで、彼らはその文脈にローカルに留まります。管理されたオブジェクトコンテキストの親子関係の階層は、アプリケーション内で作成したものと同じ長さにすることができます。

HTTP要求が失敗した場合、またはマッピング処理中にエラーが発生した場合、プライベートコンテキストは保存されず、操作は失敗したとみなされます。これは、元のMOCに変更が保存されず、操作が開始される前と同じようにオブジェクトグラフが残されることを意味します(ただし、一時オブジェクトには永続オブジェクトIDがありますが未保存のままです)。

+0

私は上記のコードでオブジェクトを作成したが、POSTリクエストを発生させずに、「作成」ビューコントローラをキャンセル/閉じるという方法でこのオブジェクトを削除しますか?ちょうど私のローカルNSMangedObjectContextを通して? –

+3

上記のコードでは、コンテキストに挿入されていますが、保存されていません。ビューコントローラの解雇のコンテキストから削除することができます。しかし、** managedObjectStore.mainQueueManagedObjectContext'にオブジェクトを直接挿入するのではなく、作成コントローラにセグメンテーションしてそれをコントローラに割り当てるときに、子マネージドオブジェクトコンテキストを作成することをお勧めします。あなたが次に行うことができるのは、あなたが取り消すときにMOC deallocをさせるだけです。 –

+0

子コンテキストを作成するためのショートカットはありますか?私は[Album createObject]のようなものを覚えています。 –

3

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

Core Dataアプリケーションと同様に、Appleは「バトンを渡す」スタイルを提案しています。

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

こちらをご覧ください:http://developer.apple.com/library/ios/#releasenotes/DataManagement/RN-CoreData/_index.html

あなたの2番目の質問については、RestKitはすべてがうまく/セットアップをマッピングされている場合は、あなたのコアデータは、あなたのAPIコールの成功を積み重ねる更新/保存を管理する必要があります。ブレイクから

RK作成者:

あなたは、POSTまたはCoreデータオブジェクトを置けば、RKはそれを永久オブジェクト IDを取得し、二次管理対象オブジェクトコンテキストを作成し、 要求を発射し、応答をマッピングします(可能な場合)。応答と マッピングが成功した場合は、それを親の コンテキストに戻すか、savesToPersistentStoreの値に基づいて持続ストア(つまりSQLite) に戻します。あなたが指定されたオブジェクトのためのRKManagedObjectRequestOperationを初期化すると

関連する問題