2012-09-30 3 views
0

내 코드는 핵심 데이터를 사용하여 여러 작업을 수행 한 다음 저장하려고하면 오류없이 중단됩니다. 저장 코드가 간단합니다 :오류없이 [managedObjectContext save :]에서 앱 종료

[[self managedObjectContext] save:&error]; 

NSLog(@"Error: %@", error); 

오류 라인에 도달하지 못하고 오류가 발생하여 해당 시점까지 홈 화면을 종료합니다.

진단에서 'Guard Malloc'이외의 항목을 모두 선택했습니다.

는 저장 명령을 실행했을 때 얻을 로그입니다 : 오류에 대한 언급이 전에 없다

CoreData: sql: BEGIN EXCLUSIVE 
CoreData: sql: SELECT Z_MAX FROM Z_PRIMARYKEY WHERE Z_ENT = ? 
CoreData: sql: UPDATE Z_PRIMARYKEY SET Z_MAX = ? WHERE Z_ENT = ? AND Z_MAX = ? 
CoreData: sql: COMMIT 
CoreData: sql: BEGIN EXCLUSIVE 
CoreData: sql: INSERT INTO ZENTRY(Z_PK, Z_ENT, Z_OPT, ZLOCATION, ZBOOKMARKED, ZCREATIONDATE, ZENTRYID, ZMESSAGE, ZSECTIONIDENTIFIER, ZTICDSSYNCID, ZVERSION) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
CoreData: sql: COMMIT 
CoreData: sql: pragma page_count 
CoreData: annotation: sql execution time: 0.0047s 
CoreData: sql: pragma freelist_count 
CoreData: annotation: sql execution time: 0.0069s 

. 내 앱에 어떤 문제가 발생했는지 알 수있는 방법은 무엇입니까?

편집 :이 문제는 [NSEntityDescription insertNewObjectForEntityForName:@"Entry" inManagedObjectContext:[self managedObjectContext]];을 호출 한 후 발생하며, 그 전에 TICoreDataSync에서 내 핵심 데이터 저장소에서 수행 한 메서드로 인해 발생합니다. 이 코드를 변경할 수 없거나 핵심 데이터 저장소에서 코드를 제거 할 수 없습니다. 여러 스레드에서 저장소에 액세스하는 것이 문제라고 생각합니다. 이제는이를 처리하는 방법을 알아야합니다 (기본 스레드에서)?

답변

3

분명히 MOC가 손상되었습니다. 여러 스레드에서 액세스하고 있습니까?

내가 할 수있는 것은, 모든 변경 (moc이 일관성있는 - 일관성있는)과 함께, 저장을 시도하는 것입니다. 부패가 발생하는 장소가 충돌하기 때문에 문제가있는 곳을 적어도 이제는 알게됩니다.

내 앱에서이 작업을 수행합니다. 사실 모든 개발자 빌드가 지속적으로 저장되며, 배포 및 품질 관리 빌드에서만이 기능이 해제되어 있습니다. 이 방법으로 많은 버그를 발견했습니다. 일부 if 플래그 문에 저장을 랩핑하거나 매크로를 작성하십시오.

+0

나는 그것을 옮겨서, [NSEntityDescription insertNewObjectForEntityForName : @ "Entry" inManagedObjectContext : [self managedObjectContext]];를 호출 한 후에 만 ​​발생한다는 것을 알아 냈다. 이것은 여전히 ​​주 컨텍스트에 있기 때문에 배경 컨텍스트에서 실행중인 다른 코드 여야한다고 가정합니다. TICoreDataSync를 dropbox로 설정했는데이 코드가 발생하기 전에 코어 데이터 저장소에서 실행됩니다. 문제의 원인이되는 코드이지만 코드를 변경할 수 없습니다. 어떻게 그것을 배경 스레드 호환 가능합니까? – Andrew

+0

이것은 오픈 소스 라이브러리이므로 코드에 액세스 할 수 있습니다. 동일한 발송 대기열을 공유하는 방법을 파악합니다. 나는 그것에 대한 경험이 없지만 적어도 이제는 문제를 안다. github 사이트 나 Google 도서관 및 '디스패치 대기열 공유 방법'에 대한 도움말을 게시하십시오. –

관련 문제