调用 NSManagedObject 函数会中断,但在访问变量时不会中断
Posted
技术标签:
【中文标题】调用 NSManagedObject 函数会中断,但在访问变量时不会中断【英文标题】:Calling NSManagedObject function breaks but not when accessing a variable 【发布时间】:2015-10-06 20:08:50 【问题描述】:所以我有一个名为 Student 的 NSManagedObject。当我在 Student 对象上调用方法时,我的一部分代码有时会中断,例如 student.performTask()
。这给了我一个 EXC_BAD_ACESS,这让我相信这是一个线程核心数据问题。但是,在代码中断之前的一行我从对象访问变量并且没有运行时错误。所以我的问题是:调用 NSManagedObject 中的变量与调用方法有什么区别?是什么导致它为一个而中断而不为另一个?
注意:在方法中执行一行之前程序会中断。
这是我的代码的 sn-p:
let attendances = Attendance.createOrUpdateFromJsonDictionary(data!)
var seenIds = [NSNumber]()
for attendance in attendances
let student = attendance.student
if !seenIds.contains(student.id) //does not complain when accessing the id
seenIds.append(student.id)
let oldCurrent = student.isCurrent //does not complain or break here
student.setIsCurrent() //<- breaks here
attendance
也是一个有学生关系的 NSManagedObject 并且我正在从出勤中抢走学生这一事实吗?
【问题讨论】:
您是否使用-com.apple.CoreData.ConcurrencyDebug 1
标志运行?这将确认或否认线程问题。其次,使用完整的错误文本更新您的问题,因为错误的其余部分可能非常有帮助。是什么让您认为您遇到了线程问题?你在使用多个线程吗?也许是网络代码?
是的,这是在线程化的 Alamofire GET 请求中调用的。我刚刚添加了标志,但我现在无法复制错误。我喜欢调试!控制台中没有错误文本,只有 exc_bad_access 在它中断的行。
【参考方案1】:
如果这是在另一个线程中调用,那么您违反了 Core Data 的线程限制规则。
我强烈建议阅读核心数据编程指南(最近更新)的并发部分并应用其中的建议。
如果您想在第三方网络库的完成块中操作,则需要针对上下文调用 -performBlock:
或 -performBlockAndWait:
,并且仅访问该块中的 NSManagedObject
实例。否则你会得到意想不到的和不一致的结果。
【讨论】:
以上是关于调用 NSManagedObject 函数会中断,但在访问变量时不会中断的主要内容,如果未能解决你的问题,请参考以下文章
segueing时出现核心数据错误:无法在NSManagedObject类上调用指定的初始值设定项
RK3399平台开发系列讲解(内核入门篇)1.52printk函数分析 - 其函数调用时候会关闭中断
RK3399平台开发系列讲解(内核入门篇)1.52printk函数分析 - 其函数调用时候会关闭中断