코어 데이터가 백그라운드 스레드에서 작동하는 것을 이해하는 데는 여전히 어려움이 있습니다. 특히 객체 삭제와 관련하여 많은 것을 읽은 후에도 어려움이 있습니다. 예를 들어코어 데이터 객체 삭제 및 백그라운드 스레드 저장
,이 같은 맥락에서 개체를 삭제하려면 :
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
NSManagedObjectContext *context = [self managedObjectContext];
if (editingStyle == UITableViewCellEditingStyleDelete)
{
// Delete object from database
[context deleteObject:[self.tests objectAtIndex:indexPath.row]];
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"Can't Delete! %@ %@", error, [error localizedDescription]);
return;
}
[self.tests removeObjectAtIndex:indexPath.row];
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
}
이 작동하지만 데이터가 큰 경우, [context save:&error]
시간이 많이 걸립니다, 그래서 내가 어떻게 할 수 백그라운드에서? 다른 컨텍스트에서 작업 할 수없는 것 같습니다. 그렇지 않으면 오류 an nsmanagedobjectcontext cannot delete objects in other contexts
이 표시됩니다. 나는 수백 가지 다른 것들을 시도했지만 잃어버린 ... 고마워!
감사! 이것은 작동하는 것 같습니다. 그냥 궁금 해서요 : NSPrivateQueueConcurrencyType 만 사용하면 괜찮습니까? – jcr
performBlock/perfomBlockAndWait을 사용하여 관리 대상 객체에서 읽을 수 있으면 좋습니다. 특히 Tableview 코드는 performBlockAndWait 호출에서 값을 복사하여 셀에 설정해야하기 때문에 약간 어색합니다. NSMainQueueConcurrencyType으로 시작 (블록에서 셀 속성을 설정할 수 있도록) 한 다음 의미가있는 경우 개인 대기열로 전환하십시오. – ImHuntingWabbits