CoreData 和 MagicalRecord - 只有当用户点击应用时,我应该如何正确处理更新数据?

Posted

技术标签:

【中文标题】CoreData 和 MagicalRecord - 只有当用户点击应用时,我应该如何正确处理更新数据?【英文标题】:CoreData and MagicalRecord - How should I properly handle updating data only when a user hits apply? 【发布时间】:2014-01-07 15:16:12 【问题描述】:

给定如下界面:

@interface Country : NSManagedObject

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * isAggressive;

@end

我有一个屏幕,用户可以在其中看到Countries 的列表并切换isAgressive 标志。只有当用户点击应用时,选项才会被保存。他们还可以选择点击取消。

基于此,我使用以下代码在屏幕加载时加载所有国家/地区:

tempContext = [NSManagedObjectContext MR_context];
// Load our countries.
countries = [Country MR_findAllSortedBy: @"name"
                              ascending: YES
                              inContext: tempContext];

我在 tempContext 而不是默认上下文中这样做,因为我不希望这些对象干扰其他任何东西。

取消时,我没有做任何具体的事情。只允许tempContext 离开范围。在申请时,我正在尝试执行以下操作:

// Save changes.
[MagicalRecord saveWithBlock: ^(NSManagedObjectContext * saveLocalContext)
 
     [countries enumerateObjectsUsingBlock: ^(Country * country, NSUInteger countryIndex, BOOL * stop)
      
          [country MR_inContext: saveLocalContext];
      ];
  completion:^(BOOL success, NSError *error) 
     NSLog(@"Completed: %@, %@.", success ? @"true" : @"false", error.localizedDescription);
     //This is called when data is in the store, and is called on the main thread
 ];

然而,这似乎并没有做出任何改变。在调试中运行时,我收到以下日志消息:

[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x6000001dc020) **未命名**上下文没有变化 - 不保存

完成:假,(空)。

我的更新没有被保存。我应该如何正确处理更新的对象并执行保存?

【问题讨论】:

展示您如何创建“临时”上下文。 tempContext 创建在示例代码中:tempContext = [NSManagedObjectContext MR_context]; 【参考方案1】:

问题是[MagicalRecord saveWithBlock... 保存的是 defaultContext 而不是你的 tempContext。

尝试调用类似[tempContext MR_saveToPersistentStoreWithCompletion ... 的东西

【讨论】:

【参考方案2】:

当您调用 [MagicalRecord saveWithBlock:] 时,此方法会创建一个新上下文,以便您在块内执行保存操作。您的用例略有不同。您已经有了一个可以使用的临时上下文,因此您想使用以下模式:

NSManagedObjectContext *scratchContext = ...;

country = [Country MR_createInContext:scratchContext];
country.name = @"Belgium";
//...what ever other data is entered here.

//Somewhere in your apply method
[self.scratchContext MR_saveToPersistentStoreAndWait];

保存方法有一些变化,请查看标头和源代码以获取更多详细信息。但基本上,你有两个选择。第一个是保存并阻止,或者等待它完成。二是后台保存。您可以传入一个完成块以了解保存操作何时完成以及是否成功。

【讨论】:

以上是关于CoreData 和 MagicalRecord - 只有当用户点击应用时,我应该如何正确处理更新数据?的主要内容,如果未能解决你的问题,请参考以下文章

未找到 CoreData+MagicalRecord.h 文件

使用 MagicalRecord 插入后 CoreData 关系未更新

使用 MagicalRecord 3 的 CoreData 内存设置

AFNetworking 2.0,使用 CoreData (MagicalRecord) 保存下载状态

数据持久化之Using CoreData with MagicalRecord

CoreData 和 MagicalRecord - 只有当用户点击应用时,我应该如何正确处理更新数据?