RestKit 0.20 - 什么是创建一个新的NSManagedObject的首选方式?(Res

2019-08-03 15:20发布

我很好奇,想知道最好的办法是在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服务器的管理对象上下文保存?

如果我决定取消这个创建过程 - 什么是删除此对象的首选方法是什么?

基本上,有多少是RestKit做我,我应该确保我做的事情。 我还没有发现这么多的文件,并想就可以了明确。

Answer 1:

当你初始化RKManagedObjectRequestOperation给定对象,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,但仍然未保存)。



Answer 2:

你应该作品(调用每次MOC在每个VC)的方式,而不是“推荐”。

苹果公司指出,就像任何核心数据的应用程序,是“接力棒”的风格。

嵌套上下文使它比以往任何时候都更重要的是,你采用访问上下文的“接力棒”的方式(通过从一个视图控制器通过上下文到下一个),而不是直接从应用程序委托取回。

在这里看到: http://developer.apple.com/library/ios/#releasenotes/DataManagement/RN-CoreData/_index.html

至于你的第二个问题,RestKit应管理保存/更新后的API调用的成功,你的核心数据堆栈,如果一切都顺利映射/设置。

从布雷克RK创造者:

如果POST或PUT一个核心数据对象,RK获得用于一个永久的对象ID,然后创建一个次级管理对象的上下文,触发该请求,并且响应(如果可能的话)映射。 如果响应和映射是成功的,它要么保存回父上下文或者基于savesToPersistentStore的值全部恢复持久性存储(即到SQLite的)的方式。



文章来源: RestKit 0.20 — What is the preferred way to create a new NSManagedObject?