调用 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函数分析 - 其函数调用时候会关闭中断

软件中断VS系统调用

在 NSManagedObject 类中获取和保存数据的函数

NSManagedObject 上的 Swift 扩展