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) 保存下载状态