2011-12-30 8 views
1

해피 뉴 이어.핵심 데이터 및 배경 스레드 관련 문제

코어 데이터를 사용하여 데이터가 저장되는 앱으로 작업하고 있습니다. 앱에는 캘린더 모듈이 포함되어 있으며 사용자는 두 버튼 (nextDay, previousDay)을 사용하여 날짜간에 앞뒤로 건너 뛸 수 있습니다. 매일 내가 webservice에서 가져 오는 정보가 들어 있으므로 사용자가 캘린더를 사용하는 동안 백그라운드에서 데이터의 많은 부분 (다음 14 일)을 가져오고 싶습니다. 첫날의

데이터는 메인 스레드에 의해 페치와 영구 저장소에 저장하고 사용자에게 제공됩니다 :

그래서 여기 내 접근 방식입니다. 그런 다음 NSThread가 데이터를 가져 오는 새로운 nsmanagedcontext로 백그라운드에서 시작되고 모든 데이터가 페치되면 영구 저장소에 저장됩니다.

그러나이 백그라운드 스레드가 실행되는 동안 사용자는 다음 날 또는 전날까지 건너 뛸 수있는 옵션을 가지고 있으며 데이터가 없으면 메인 스레드는 데이터를 가져 와서 영구 저장소에 저장합니다. 이것은 두 스레드가 동일한 데이터를 가져 와서 영구 저장소에 저장하는 가능성을 제시합니다. 그러나 백그라운드 스레드에 대해 새 nsmanangedcontext를 사용하는 경우이 방법이 문제가되지 않아야 함을 이해했습니다.

가끔 다음 오류가 발생합니다. 작업을 완료 할 수 없습니다. (코코아 오류 133020) 및 주 스레드가 영구 저장소에 저장할 수 없습니다.

스레드간에 공유 된 하나의 nsmanagedcontext 만 사용하려했으나 언젠가 스레드 중 하나가 멈추고 계속 이동하지 않습니다.

저는 다른 포럼/블로그를 읽고 많은 사람들이 올바른 방향으로 나를 도울 수 있기를 바랍니다. HELP 해결할

관련

: 내가지고 있다고 오류 내 영구 저장소에 저장할 때 병합하는 동안 오류 때문이었다. 절약 할 때 병합 정책을 변경하여 해결할 수있었습니다. 다음 스 니펫은 nsmanagedcontext의 init에 대한 내 방법을 보여줍니다. 굵은 글씨는 정책 설정을 보여줍니다. 내가 가져 오는 데이터가 주 스레드 또는 백그라운드 스레드인지 여부와 상관없이 동일하므로이 작업을 수행 할 수 있습니다.

- (NSManagedObjectContext *)managedObjectContext 
{ 
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) 
    { 
     __managedObjectContext = [[NSManagedObjectContext alloc] init]; 
     [__managedObjectContext setPersistentStoreCoordinator:coordinator]; 
      **[__managedObjectContext setMergePolicy:NSOverwriteMergePolicy];** 
    } 
    return __managedObjectContext; 
} 
+0

(강조 색상도 멋있습니다.) 등.내가 당신의 질문을 클릭했을 때 나의 첫번째 생각은 "나는 그 모든 것을 읽지 않는다"이다. –

+0

안녕하세요 Paul, 편집장이 내 공간을 삭제했다. 내가 크롬을 사용하고 있기 때문에 내가 뭔가를 해야할지 모르겠다. – Bjarke

+1

아니면 P – Bjarke

답변

1

http://developer.apple.com/library/ios/#documentation/cocoa/Reference/CoreDataFramework/Miscellaneous/CoreData_Constants/Reference/reference.html에 따라 오류 코드는 NSManagedObjectMergeError를 나타냅니다. 당신이 항상 동일한 데이터를 가져 오는 이후

, 나는 당신이 백그라운드 스레드 또는 메인 스레드에서 그것을 가지고 있는지 동일해야 겠지, 그래서 당신은 NSErrorMergePolicy 기본 의에서 병합 정책을 변경 할 수 있어야한다 NSOverwriteMergePolicy으로 충돌하는 개체를 새 데이터로 덮어 씁니다 (다시 동일한 것으로 가정하면 문제가되지 않습니다).

현재 병합 정책에 대한 자세한 내용을 확인할 수 있습니다 http://developer.apple.com/library/ios/#documentation/CoreData/Reference/NSMergePolicy_Class/Reference/Reference.html#/

정말 귀하의 질문에 관련된하지만 정말 당신이 가능하게 코드 조각을 포함하여 작은 조각 (수직 공백이 당신의 친구입니다)에 답을 어기면 도움이되지 않음
+0

안녕하세요, 데이터는 항상 동일하므로 우선이 방법을 시도하고 문제가 해결되면 다시보고하겠습니다. – Bjarke

+0

분명히 이것은 트릭을하는 것처럼 보였습니다. 나는 오류나 이상한 변화를 얻지 못했습니다. 새 코드 스 니펫을 게시물에 추가하겠습니다. – Bjarke

+0

추신 : 내 주말을 저장하셨습니까? :) – Bjarke