使用带有 ios 5 核心数据并发的 RestKit 时崩溃

Posted

技术标签:

【中文标题】使用带有 ios 5 核心数据并发的 RestKit 时崩溃【英文标题】:Crash when using RestKit with ios 5 core data concurrency 【发布时间】:2013-03-04 17:25:16 【问题描述】:

我是 Core Data 的新手,也是 RestKit。

由于存在一些性能问题,我想在 ios5 中使用并发技术。但是,当它与 RestKit 结合时,就出现了崩溃问题。这是我的崩溃代码:

[[RKObjectManager sharedManager] getObjectsAtPath: HOT_PATH
                                       parameters: params
                                          success:
 ^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 
    NSManagedObjectContext *newContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
     newContext.parentContext = [self managedContext];
     [newContext performBlock:^

         Rumor *rumorInOtherContext = (Rumor *)[mappingResult.array lastObject];;
         Rumor *rumor = (Rumor *)[newContext objectWithID:rumorInOtherContext.objectID];

         rumor.updateDate = [NSDate date]; // <- crash at this point.
];

但是,我的旧版本代码不会崩溃:

[[RKObjectManager sharedManager] getObjectsAtPath: HOT_PATH
                                       parameters: params
                                          success:
 ^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 
    Rumor *rumor = (Rumor *)[mappingResult.array lastObject];;
    rumor.updateDate = [NSDate date]; // <- save!
];

控制台对话框中没有出现崩溃报告。 :(

我的代码正确吗?或者,是否有其他方法可以做同样的事情?

【问题讨论】:

这是我代码的简化版,后面的做法会变成性能问题,会消除UX。 【参考方案1】:
    您使用的 iOS 目标版本是什么? 您使用的是哪个版本的 RK?

如果您的目标是 5.x,则不能将基于块的并发编程代码用于 Core Data 或父子上下文。 (是的,它们在 5.x 中被合并到 iOS 中,但在 6.x 之前它不起作用并且不安全)

您可能想查看GCD。

我对 RK 有很多问题,并决定放弃它,就像在这个问题中讨论的那样:

RestKit and saving to CoreData as NSManagedObject

什么是堆栈跟踪(如果您在设备上遇到这种情况,将会有一个崩溃日志,您可以从 Window->Organizer->Devices 访问该日志)告诉您何时崩溃???

【讨论】:

我现在换到iOS 6.1,但还是不行。而RK版本是0.20.0pre4。堆栈跟踪显示崩溃点是rumor.updateDate = [NSDate date] 您确定 [self managedContext] 已设置(并且不是拼写错误)吗?注销您的“谣言”变量,并确保您确实从新上下文中获取了谣言对象。 我很确定。这是日志:` 2013-03-05 10:16:23.321 谣言 [39050:c07] parentContext = 2013-03-05 10:16:23.321 谣言 [39050:4903] 谣言 = (实体:谣言;id:0xaed7d10 ;数据:)`

以上是关于使用带有 ios 5 核心数据并发的 RestKit 时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 5 中使用 UIManagedDocument 和父/子上下文导入核心数据背景

如何在 iOS 的核心数据中创建和使用带有查询的 NSPredicate?

通过 Cocoapods 安装 RestKit 0.20.0 后基础类型未知

核心数据,使用啥并发模型?

iOS - 核心数据堆栈作为带有主 NSManagedObjectContext 的单例

简单并发核心数据