这个 MagicalRecord 被弃用的调用方法有什么替代方式?

12

我该如何在MagicalRecord中找到这个废弃方法的替代方法?我已经查看了Google、SO和文档,但是似乎没有替代方法,当然,文档中也没有告诉你哪个方法替换了这个废弃的方法。 :-{

[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveErrorHandler:^(NSError *error)
2个回答

23

所涉及的弃用方法是:

[NSManagedObjectContext MR_contextForCurrentThread]

我之前在个人博客上写过一篇关于这个问题的博客文章,虽然我承认它并不在任何官方文档中。简单来说,在GCD和队列的世界里,尽管GCD在线程上运行,但你无法保证队列与线程之间有1-1的映射关系。为了确保事情朝着正确的方向发展,请使用以下模式:

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
    //make your changes in the localContext
}];

通过在线程特定上下文中执行所有工作,强制遵守应该在不同线程中执行所有工作的规则,这解决了contextForCurrentThread中出现的微妙跨线程问题。每次保存时创建新上下文,而不重用上下文,您将确保不会跨线程,并且不会使应用程序1%的时间崩溃。


1
那么我应该用什么替换 MR_saveErrorHandler: 呢? - SpokaneDude
非常感谢您...换个话题,我喜欢阅读PDF格式的文档...您是否有兴趣让我创建一个当前"Docs"文件夹中所有文件的PDF版本呢?我想要"回馈社会",开心得帮忙 :D - SpokaneDude
如果您可以将其制作成脚本以便更新文档,我想这是可以的。然而,我认为一个文档集可能会更有用。您是否查看了Cocoadocs上MagicalRecord生成的文档页面?我们正在逐步添加头文件文档,以使其更兼容此项目。它应该比生成的PDF文档更加实时。 - casademora
1
MR_contextForCurrentThread已被弃用。应该使用什么替代? - Gargo
1
saveWithBlock并没有解释如何从正确的MOC中检索实体。也就是说,我该如何从当前线程获取实体? - lostintranslation
显示剩余4条评论

1

casademora是正确的,但我会更加精确,因为在转换我的时候遇到了一些问题。

    [[NSManagedObjectContext MR_contextForCurrentThread] MR_saveToPersistentStoreWithCompletion:nil];

into

    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext)

你必须小心地在块内更改或创建实体,但这还不够。

要检索你的实体,你必须使用带有上下文的选择请求。

MR_findFirstByAttribute:withValue

仅仅使用该方法是不够的,更新将无法被保存。你需要使用 代替。

MR_findFirstByAttribute:withValue:InContext:localContext

在创建实体时,情况是一样的

MR_createEntity

必须更改为:

MR_createEntityInContext:localContext

然后它就像魔法一样工作 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接