0

所以我有一個名爲學生的NSManagedObject。當我調用學生對象的方法時,例如student.performTask(),有時會有部分代碼中斷。這給了我一個EXC_BAD_ACESS,這讓我相信這是一個線程核心數據問題。但是,在代碼中斷之前的一行我從對象訪問變量,並且沒有運行時錯誤。所以我的問題是:調用NSManagedObject中的變量與調用方法之間有什麼區別?是什麼導致它打破一個而不是另一個?調用NSManagedObject函數中斷,但不訪問變量時

注意:在執行方法中的單行之前,程序會中斷。

這裏是我的代碼片段:

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?

+0

你用'-com.apple.CoreData.ConcurrencyDebug 1'標誌運行嗎?這將確認或否認線程問題。其次,用完整的錯誤文本更新您的問題,因爲其餘的錯誤可能非常有用。是什麼讓你認爲你有線程問題?你使用多線程?網絡代碼也許? –

+0

是的,這是在線程Alamofire GET請求內部調用的。我只是添加了標誌,但我現在無法重複該錯誤。我喜歡調試!在控制檯中沒有錯誤文本,只是在它正在破壞的行上的exc_bad_access。 – boidkan

回答

0

如果這是在另一個線程中調用,那麼你違反了Core Data的線程約束規則。

我強烈建議閱讀核心數據編程指南(最近更新)的併發部分並應用其中的建議。

如果你想在第三部分網絡圖書館建成塊進行操作,那麼你將需要調用-performBlock:-performBlockAndWait:反對的背景下,只有在該塊內訪問NSManagedObject實例。否則,你會得到意想不到的結果。