2014-07-16 3 views
0

매우 긴 코어 데이터 삭제 작업이 92k의 일부 홀수 레코드로 실행하는 데 시간이 오래 걸립니다. 처음에는 UI 스레드를 잠그기 때문에 백그라운드 스레드에서 호출을 시도했습니다. 그러나 시뮬레이터에서 내가 알아 차 렸던 것은 앱을 배경으로 할 때이 작업이 멈추는 것입니다.백그라운드/포 그라운드 모드에서 코어 데이터 삭제가 오래 걸림

응용 프로그램이 10 분 동안 백그라운드에서 실행되었거나 실행이 허용되면 내 삭제가 계속 실행될 수 있도록 코드를 만들 수 있는지 궁금합니다. 나는 내 수업을 시작하면

나는 배경 큐합니다 다음

backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, nil); 

을 그 시간이 코드는 UI가 더 반응 했는가

- (void)queueForDelete:(FlightRecording *)flight { 

    NSError *error = nil; 
    flight.deleteFlagValue = 1; 
    [managedObjectContext save:&error]; 

    // Remove flights form Internal table dataStructure 
    [flightList removeObjectAtIndex:[tmpIndexPath row]]; 
    [[self tableView] deleteRowsAtIndexPaths:@[tmpIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 

    //Queue flight for deletion in the background 
    dispatch_async(backgroundQueue, ^{ 
     NSLog(@"Adding %@ to deletion Queue", flight.getFileName); 
     [self deleteFlight:flight]; 
    }); 
    [[self tableView] reloadData]; 
} 

내 개체를 삭제하지만 여전히 걸리는 경우 약 5 분 ~ 10 분 (시뮬레이터에서) 내 개체를 삭제합니다. 배경/전경에 관계없이 응용 프로그램의 응답성에 영향을주기 때문에 사용자가 응용 프로그램을 배경으로 삭제 프로세스를 계속 실행할 수 있기를 바랍니다.

+0

'deleteRowsAtIndexPaths'를 호출 했으므로'reloadData'를 호출 할 필요가 없습니다. – Paulw11

답변

0

NSManagedObjectContext-performBlock: 호 내에서이 작업을 수행하십시오. 개인 큐 동시성 유형을 가진 하위 컨텍스트에서 수행하십시오. 그러면 비동기 처리가 제공됩니다.

각 통화에서 컨텍스트를 저장하지 마십시오.

각 호출마다 테이블 뷰 (reloadData, delteRowsAtIndexPaths)를 업데이트하지 마십시오. 이것은 모델 작업입니다. UI를 업데이트하지 마십시오.

tmpIndexPath은 코드 냄새입니다. 이는 모델 작업을보기 작업과 혼합하는 또 다른 신호입니다. 일련의 객체를 삭제하는 것은 순전히 모델 작업입니다. UI 또는 컨트롤러가 존재하지 않는다고 가정합니다.

+0

레코드 당 하나의 자식 컨텍스트가 삭제되기 시작합니까? 또는 preformBlocks를 계속 던지고있는 자식 단일 자식 컨텍스트? – Jeef

+0

아니요. 하지만 네가 가까워. 자식 컨텍스트를 만듭니다. 삭제할 모든 객체를 반복 실행하고 삭제할 -performBlock을 보냅니다. 해당 블록의 끝에서 하위 컨텍스트를 저장하십시오. 결과를 확인하십시오 (아마 외부의 실수를 피하면서 성공할 것입니다). 블록 내에서 스레드가 끝나기 바로 전에 주 스레드에 호출 (async)을 대기열에 넣고 주 스레드에게 UI를 업데이트해도되는지 확인합니다. –

+0

또한 tmpIndexPath =>에 관해서는 코어 데이터와 모델을 분리하여 fetchedResultsController를 처리하는 대신 배열에 수동으로 데이터 모델을 생성했습니다. tmpIndexPath는 개체의 "삭제 대기 중"플래그를 업데이트하여 남겨둔 모델을 다시 생성 할 때 – Jeef