2016-10-01 3 views
0

메시지를 백그라운드 큐에 저장하려고하고 메인 부모와 자식이라는 두 가지 컨텍스트를 사용하여 대기열에 보관합니다. 하지만 내 응용 프로그램은 계속 충돌합니다. 내 스택 트레이스는 여기부모 자식 컨텍스트 크래시 코어 데이터 (libC++ abi.dylib : NSException (녹화 프레임) 유형의 캐치되지 않는 예외로 종료)

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 

let privateMOC = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType) 


let doubletimestamp = Double(timestamp) 
    let date = Date(timeIntervalSinceReferenceDate: (doubletimestamp)) 
    let status = "..." 

    let message = NSEntityDescription.insertNewObject(forEntityName: "Mesages", into: self.privateMOC) as! Mesages 
    message.text = text 
    message.timestamp = date as NSDate   

    do { 
     try self.privateMOC.save() 
     self.inputToolbar.toggleSendButtonEnabled() 

     self.context.performAndWait { 

      do { 
       try self.context.save() 
      } catch { 
       fatalError("Failure to save context: \(error)") 
      } 

     } 

    }catch let err { 
     print(err) 
    } 

    } 

: : 여기

Core Data, Multithreading, and the Main Thread

내 코드입니다 ... 왜 작동하지 않는 그, 확실하지 않은 사과 문서를 사용 enter image description here

답변

2

좋아, 그래서 거기를 당신이 가진 두 가지 문제가 있습니다.

첫 번째는 부모 컨텍스트를 설정하지 않았다는 것입니다. 이 작업을 수행하지 않으면 기본 관리 컨텍스트로 전파되지 않습니다.

둘째는 자체 관리 컨텍스트를 자체 블록에서 변경하지 않는다는 것입니다. 일반 관리 컨텍스트 (예 : 수행 한)를 실행해야하는 것과 동일한 방식으로 사설 컨텍스트가 동일하게 수행해야합니다.

그래서 완성 된 코드는 다음과 같이한다 : -

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 

let privateMOC = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType) 

private.parentContext = context 

let doubletimestamp = Double(timestamp) 
let date = Date(timeIntervalSinceReferenceDate: (doubletimestamp)) 
let status = "..." 

privateMOC.performBlock { 

    let message = NSEntityDescription.insertNewObject(forEntityName: "Mesages", into: self.privateMOC) as! Mesages 
    message.text = text 
    message.timestamp = date as NSDate   

    do { 
     try self.privateMOC.save() 
     self.inputToolbar.toggleSendButtonEnabled() 

     self.context.performAndWait { 

      do { 
       try self.context.save() 
      } catch { 
       fatalError("Failure to save context: \(error)") 
      } 

     } 

    }catch let err { 
     print(err) 
    } 

    } 
} 
관련 문제