【问题标题】:Calling NSManagedObject function breaks but not when accessing a variable调用 NSManagedObject 函数会中断,但在访问变量时不会中断
【发布时间】: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 在它中断的行。

标签: multithreading swift core-data exc-bad-access nsmanagedobject


【解决方案1】:

如果这是在另一个线程中调用,那么您违反了 Core Data 的线程限制规则。

我强烈建议阅读核心数据编程指南(最近更新)的并发部分并应用其中的建议。

如果您想在第三方网络库的完成块中操作,则需要针对上下文调用 -performBlock:-performBlockAndWait:,并且仅访问该块中的 NSManagedObject 实例。否则你会得到意想不到的和不一致的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-10
    • 2014-09-12
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 2019-11-02
    相关资源
    最近更新 更多