내 코드는 핵심 데이터를 사용하여 여러 작업을 수행 한 다음 저장하려고하면 오류없이 중단됩니다. 저장 코드가 간단합니다 :오류없이 [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에서 내 핵심 데이터 저장소에서 수행 한 메서드로 인해 발생합니다. 이 코드를 변경할 수 없거나 핵심 데이터 저장소에서 코드를 제거 할 수 없습니다. 여러 스레드에서 저장소에 액세스하는 것이 문제라고 생각합니다. 이제는이를 처리하는 방법을 알아야합니다 (기본 스레드에서)?
나는 그것을 옮겨서, [NSEntityDescription insertNewObjectForEntityForName : @ "Entry" inManagedObjectContext : [self managedObjectContext]];를 호출 한 후에 만 발생한다는 것을 알아 냈다. 이것은 여전히 주 컨텍스트에 있기 때문에 배경 컨텍스트에서 실행중인 다른 코드 여야한다고 가정합니다. TICoreDataSync를 dropbox로 설정했는데이 코드가 발생하기 전에 코어 데이터 저장소에서 실행됩니다. 문제의 원인이되는 코드이지만 코드를 변경할 수 없습니다. 어떻게 그것을 배경 스레드 호환 가능합니까? – Andrew
이것은 오픈 소스 라이브러리이므로 코드에 액세스 할 수 있습니다. 동일한 발송 대기열을 공유하는 방법을 파악합니다. 나는 그것에 대한 경험이 없지만 적어도 이제는 문제를 안다. github 사이트 나 Google 도서관 및 '디스패치 대기열 공유 방법'에 대한 도움말을 게시하십시오. –