Ios 我如何使用魔法记录来创建&;不使用contextForCurrentThread更新对象并保存它们
我刚刚在上读了MagicalRecord的博客文章Ios 我如何使用魔法记录来创建&;不使用contextForCurrentThread更新对象并保存它们,ios,core-data,rubymotion,magicalrecord,Ios,Core Data,Rubymotion,Magicalrecord,我刚刚在上读了MagicalRecord的博客文章 contextForCurrentThread已被弃用,应改用saveWithBlock,因为它为相关线程创建了一个安全的新NSManagedObjectContext 到目前为止,我一直在我的应用程序中广泛使用contextForCurrentThread。然而,我很难理解如何使用saveWithBlock,因为我的获取和保存不一定是按顺序进行的 目前我正在做的事情有: 不使用contextForCurrentThread创建和更新对象,然
contextForCurrentThread
已被弃用,应改用saveWithBlock
,因为它为相关线程创建了一个安全的新NSManagedObjectContext
到目前为止,我一直在我的应用程序中广泛使用contextForCurrentThread
。然而,我很难理解如何使用saveWithBlock
,因为我的获取和保存不一定是按顺序进行的
目前我正在做的事情有:
不使用
contextForCurrentThread
创建和更新对象,然后保存它们的推荐方法是什么?因此,我使用objective C而不是RubyMotion,但您应该能够执行以下操作:
MagicalRecord.saveWithBlock(
lambda { |localContext|
person = Person.MR_createInContext(localContext)
#update person stuff here
}
)
编辑
如果以后要保存上下文,只需保留它:
// Somewhere in your ViewController, etc
NSManagedObjectContext *context = [NSManagedObjectContext MR_confinementContext];
// Somewhere else
Person *p = [Person MR_createInContext:context];
// And in yet another method
[context MR_saveToPersistentStoreAndWait];
这里的主要思想是,您只需要保留上下文,并在准备就绪时对其执行操作。如果要进行后台保存,可以使用以下方法:
[context MR_saveToPersistentStoreCompletion:^(BOOL success, NSError *error){
//called on the main thread when save is complete
}];
这里我可能弄错了,但我认为魔法记录并没有为这个用例做好准备。
以下是我如何在纯核心数据中实现您所需的功能:
[context performBlock:^{
ZAssert([context save:&error], @"Save failed: %@\n%@", [error localizedDescription], [error userInfo]);
}];
这似乎是解决此类问题的标准方法。它在网上有很好的描述,例如..这是一个新api的教程: 参考文献如下:
[MagicalRecord SetupCoreDataStackWithStoreName:@“MyDatabase.sqlite”]代码>
[MagicalRecord清理]代码>
Person*alex=[Person MR_createEntity];
alex.name=@“alex”;
alex.age=@23代码>
NSArray*people=[personmr_findAll]代码>
//检索第一条记录
Person*aPerson=[Person MR_findFirst]代码>
//有条件地检索记录并排序
NSArray*people=[MR_findByAttribute:@“name”带值:@“alex”和Derby:@“age”升序:是]代码>
aPerson.age=@56代码>
[personmr_truncateAll]代码>
//检索单个记录后,删除该记录
[alex MR_deleteEntity]代码>
[[NSManagedObjectContext MR_defaultContext]MR_savetopersistentstore并等待]代码>
//再次检查MagicalRecord repo以了解更多保存选项
这不是一次创建和保存所有内容吗?我是否可以创建Person对象,然后在将来的另一个时间点保存?
MR_-constrationcontext
在MagicalRecord的2.2版中不可用。您推荐Github上的哪个分支?我可以在MagicalRecord的第3版中使用MagicalRecord.saveWithBlock
作为后台线程来实现这一点。在主线程上使用:MagicalRecordStack.defaultStack.context
。只需注意,在回答中,方法MR\u saveToPersistentStoreCompletion
应该是MR\u saveToPersistentStoreWithCompletion
是否手动管理线程?您确定person=person.MR_createInContext(localContext)
和localContext.MR_saveToPersistentStoreWithCompletion
在同一个线程上执行吗?或者您的代码的两个部分都在主线程上执行?(这会使事情简化很多)我使用不同的线程,我正在调用NSManagedObjectContext.MR\u contextForCurrentThread.MR\u savetopersistentstore and wait
。因此您不确定创建人员的上下文是否与执行MR\u savetopersistentstore with completion
的上下文相同?MagicalRecord肯定可以处理这种情况,轻松地。看见你也应该远离数据单例,因为现在它很容易实现,但以后会给你带来疯狂的问题。在您的回答中,您写了,这里的主要思想是您只需要保持上下文并执行,那么假设用户访问了两个不同的视图控制器,您会将上下文保存在哪里?您可以在VCs之间传递它吗?您可以为每个新上下文创建一个新上下文。MagicalRecord可以帮助您在上下文之间合并更改,而不会让您的应用程序代理陷入困境(这会导致更大的痛苦),我是在原始问题的上下文(双关语不是有意的:)中提出的。让我们假设它如下所示:创建了一个新的上下文,在其中进行了一些更改;然后用户在不同的视图控制器之间移动;在某个时间点,用户希望在上下文中保存更改(他可能处于与创建上下文的VC不同的VC中)。这种设置允许我们不将当前上下文中的更改保存到持久存储中,例如,当用户在某个点取消时。
[context MR_saveToPersistentStoreCompletion:^(BOOL success, NSError *error){
//called on the main thread when save is complete
}];
[context performBlock:^{
ZAssert([context save:&error], @"Save failed: %@\n%@", [error localizedDescription], [error userInfo]);
}];