해피 뉴 이어.핵심 데이터 및 배경 스레드 관련 문제
코어 데이터를 사용하여 데이터가 저장되는 앱으로 작업하고 있습니다. 앱에는 캘린더 모듈이 포함되어 있으며 사용자는 두 버튼 (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;
}
(강조 색상도 멋있습니다.) 등.내가 당신의 질문을 클릭했을 때 나의 첫번째 생각은 "나는 그 모든 것을 읽지 않는다"이다. –
안녕하세요 Paul, 편집장이 내 공간을 삭제했다. 내가 크롬을 사용하고 있기 때문에 내가 뭔가를 해야할지 모르겠다. – Bjarke
아니면 P – Bjarke