使用带有 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 = 以上是关于使用带有 ios 5 核心数据并发的 RestKit 时崩溃的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 5 中使用 UIManagedDocument 和父/子上下文导入核心数据背景
如何在 iOS 的核心数据中创建和使用带有查询的 NSPredicate?
通过 Cocoapods 安装 RestKit 0.20.0 后基础类型未知