2016-07-23 1 views
6

내 응용 프로그램은 웹 서비스에 연결하고 3 가지 방법으로 POST를 수행하며 각각의 3 가지 데이터 세트를 코어 데이터에 삽입합니다. 새로운 데이터가있을 때마다 핵심 데이터의 모든 것이 삭제되고 새로운 데이터가 삽입됩니다. 이 3 가지 방법은 각각 TableViewControllers에 표시되며, 이는 TableViewControllers이 표시 될 때마다 3 회 이상 가져 오기를 의미합니다.코어 데이터 삭제, 삽입 및 가져 오기를 수행하는 올바른 스레드

우리는 웹 서비스에서 가져온 데이터 3 세트를 가져온 다음이 데이터를 모두 다른 엔터티에 삽입하여 새로운 데이터를 가져 와서 TableViewController 메인에 표시합니다.

이제 스레드와 멀티 컨텍스트 코어 데이터 구조의 복잡한 관계로 고민하고 있습니다. 내 응용 프로그램의 스레드 안전성을 보장하기 위해 어디에서 삽입, 삭제 및 가져 오기를 수행해야합니까?

+0

얼마나 많은 데이터가 있습니까? 현재 어떤 문맥과 스레드가 있습니까? – Wain

+0

@Wain 데이터가 비교적 작습니다. 각 엔티티에 약 1,000 개의 레코드가 있습니다. NSURLSession은 주 스레드에서 완료 처리기로 작업하고 있습니다. 그런 다음 삭제 (메인 스레드 NSMainQueueConcurrencyType에서 수행됨) 및 삽입 (메인 스레드/NSPrivateQueueConcurrencyType) 메소드를 호출합니다. 그런 다음 주 스레드 및 주 컨텍스트에서 가져 오기를 수행합니다. – user3687

답변

1

다중 컨텍스트 CoreData에서 privateQueueRootMOC 및 mainQueueRootMoc을 가질 수 있습니다. 주 MOC는 mainThread에서 데이터를 반입하는 데 사용되며 개인 MOC는 privateMOC 스레드에서 데이터를 업데이트, 삽입 및 삭제하는 데 사용됩니다.

privateMOC.performBlock({() -> Void in 
    //try insert, delete, update 
    .... 
    try privateMOC.save() 
    onCompleteBlock() //fetch data in main thread use main MOC 
}) 
+0

자, 이제 개인용 MOC의 수행 블록에 삽입 및 삭제를 수행했는데 제대로 작동하는 것 같습니다. 하지만 한 가지 문제가 있습니다. 모든 것을 새로 고침 (webservice에 연결하고, 코어 데이터에 삽입 및 삭제) 한 다음 반입을 수행하여 몇 초 동안 nil을 반환합니다. 새 데이터가 삽입되기 전에 삭제가 주 컨텍스트에 저장되는 것 같습니다. – user3687

+0

주 MOC에서 privateMOC.save() 다음에 완전한 콜백 블록을 추가하고 주 스레드에서 데이터를 읽으면 주 MOC를 사용해야합니다. 또는 메인 MOC의 NSFetchResultController를 사용하여 CoreData에서 변경된 데이터를 관찰 할 수 있습니다. – Hao

4

UI는 기본 컨텍스트에서 주 스레드에서 가져옵니다.

가져 오기의 경우 주 스레드에서 세션 콜백을 실행하지 말고 백그라운드 대기열에서 실행하십시오. 새 개인 컨텍스트를 만들고 main을 부모로 설정합니다. 세션 콜백에서 블록 인터페이스를 사용하여 백그라운드 컨텍스트를 가져 와서 저장 한 다음 부모를 다시 가져옵니다 (블록 인터페이스 사용).

+0

백그라운드 스레드에서 세션 콜백을 디스패치하고 MainThread에서 삽입을 계속 시도했지만 MainContext의 SaveContext와 관련된 몇 가지 문제에 직면했습니다. "가져 오기 블록 인터페이스 사용"이란 정확히 무엇을 의미합니까? 나는 너를 이해하지 못했다. – user3687

+0

NSManagedObjectContext는 안전한 방법으로 실행할 코드를 제출할 블록 인터페이스를 제공합니다. – Wain

+0

이로 인해 코어 데이터에 데이터를 삽입하는 동안 주 스레드가 차단되고 UI가 응답하지 않습니다. 나는 삭제와 삽입이 다른 스레드에서 수행되어야한다고 생각한다. 그러나 다시 내가 이것을 할 때 나는 가져 오는 데이터가 때로는 잘못되어 그 같은 가져 오기가 완전히 수행되지 않는다. – user3687

관련 문제