2013-03-15 1 views
1

내 앱 (대상 iOS 6 이상)에 대시 보드보기가 있습니다. 활동 표보기 및 활동 세부 정보보기 (훨씬 더 많지만 상관 관계가 없습니다. 이 주제에 대해).Coredata가 관리 대상 개체를 가져 오는 동안 개체의 다른 인스턴스를 편집하는 중 충돌이 발생합니다

일단 사용자가 대시 보드를 방문하면 활동에 대한 업데이트가 실행됩니다. 이 과정에서 필요한 경우 핵심 데이터에서 활동 목록을 업데이트 할 수 있습니다. 업데이트가 완료되면 테이블보기를 열면 모든 것이 정상입니다. 하지만 업데이트 도중에 앱을 열면 앱이 다운됩니다. (테이블 뷰에서 핵심 데이터 (동일한 객체)의 활동 목록을로드합니다.

오류 : 'NSInvalidArgumentException'이라는 캐치되지 않은 예외로 인해 앱 종료 중입니다. 'ALL 또는 ANY의 왼쪽 편' 연산자는있는 NSArray 또는 NSSet이어야합니다 '

잘 나는 내가

fetchrequest가 업데이트되지있을 때이 오류는 문이 잘 작동 말한다 때문에 무엇을 잘못 생각 :.

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Activity" inManagedObjectContext:managedObjectContext]]; 
[fetchRequest setRelationshipKeyPathsForPrefetching:@[@"followedPlayer"]]; 
[fetchRequest setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"calendarDate" ascending:YES], [NSSortDescriptor sortDescriptorWithKey:@"startTime" ascending:YES]]]; 
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"ANY typeOfActivity IN %@", array]]; 

개인적으로 나는 prob 나는 하나의 Activity에 대해 두 개의 인스턴스가 있고 하나는 편집 중이며 managedobjectcontext (managedobjectcontext는 singleton 임)에서 아직 save이 호출되지 않은 것입니다. 그런 다음 save가 호출 될 때 (또는 첫 번째 객체가 변경 사항을 저장하지 않은 상태에서 두 번째 객체가 만들어 질 때) 응용 프로그램이 충돌합니다.

이 문제는 활동 배열의 인스턴스가 항상 존재하도록 (또는 업데이트하는 동안 tableview에 대한 액세스 만 차단하도록) 활동 배열로 싱글 톤 클래스를 작성하여 해결할 수 있다고 생각합니다. 그러나 이것이 더 좋은 방법으로 이루어질 수 있는지 궁금합니다.

마음에있는 방법은 핵심 데이터에서 읽기 전용/관리되지 않는 개체를 가져 오는 것입니다. 이 작업은 sqlite 데이터베이스에 직접 액세스하여 수행 할 수 있습니다. 그러나 세부적인 관점에서 볼 때 나는 활동과 관계가있는 다른 대상들을 얻어야 만합니다. 그렇게 생각하면 실제로 갈 길이 없습니다.

누구나 지금 가능한 경우 (및 방법) 읽기 전용 관리되는 개체 또는 그와 같은 직접 sqlite 데이터베이스에 액세스하지 않고 얻을 수 또는 나는 그냥 그래서 내가 가지지 않는 활동을 포함하는 클래스에 가야합니까 중복?

종류는

사렌 인덴

+0

이들은 서로 다른 스레드에 있어야합니다. 맞습니까? – borrrden

+0

맞습니다. 백그라운드에서 업데이트가 진행됩니다. 테이블 뷰로드는 주 스레드에 있습니다. –

+1

그러면 관리 대상을 싱글 톤으로 만들어 코어 데이터 원칙 중 하나를 위반합니다 (스레드간에 컨텍스트를 공유하지 않음). – borrrden

답변

1

코어 데이터가 하지 스레드 안전 간주한다. 스레드간에 NSManagedObjectContext 또는 NSManagedObject을 공유하는 경우 이와 같은 많은 문제가 발생할 것으로 예상됩니다. 더 자세한 내용은 Concurrency with Core Data을 확인하십시오.

또한 iOS 5.0부터는 concurrencyTypeNSManagedObjectContext으로 설정할 수 있습니다. three types이 있습니다. 대기열 기반 유형의 경우 핵심 데이터로하는 모든 작업이 performBlock:performBlockAndWait: 메소드를 통해 이루어 지도록해야합니다. 나는 여러 번 잊어서 화상을 입었습니다 (교착 상태를 통해 자주 나타납니다).

관련 문제