2013-12-26 2 views
2

백그라운드에서 데이터를받는 VOIP/Chat 응용 프로그램을 만들고 있습니다. 백그라운드에서 UI 변경을 방지하기 위해 앱이 백그라운드로 이동할 때 NSFetchedResultsController을 사용 중지해야합니다. 내가 이런 식으로 그것을 할 -배경 사용 응용 프로그램에서 NSFetchedResultsController를 사용하거나 사용하지 않도록 설정하십시오.

- (void)applicationWillResignActive 
{ 
    [super applicationWillResignActive]; 
    self.fetchedResultsController.delegate = nil; 
} 

- (void)applicationDidBecomeActive 
{ 
     [super applicationDidBecomeActive]; 
     self.fetchedResultsController.delegate = self.fetchResultControllerDelegate; 
} 

내가 포 그라운드로 돌아올 때 [self.tableView reloadData]를 호출 할 필요가없는 것으로 나타났습니다. (EDIT : 응용 프로그램이 백그라운드에 있고 fetchedResultsController.delegate가 nil 인 동안 핵심 데이터 DB가 새 데이터로 업데이트되었음을 ​​명확히하기 위해). 그리고 fetchedResultsController.delegate을 재 할당하면 바로 테이블이 업데이트됩니다.

  1. 무엇을 업데이트합니까? fetchedResultsController은 재 할당 될 때 프리폼을 가져 옵니까?
  2. tableViewfetchedResultsController 사이에 충돌을 일으킬 수있는 함정이 있습니까?

덕분에 재 할당 할 때 업데이트하게이의 fetchedResultsController의 예비 인출 무엇

+0

fetchResultController는 ManagedObject가 값을 업데이트하고 대리인이 tableView를 업데이트 할 때마다 위임 호출을 위임합니다.보기 – Retro

+0

@Retro 안녕하세요, 저는 알고 있지만 백그라운드에서 이루어진 업데이트는 어디에서나 확인할 수 있습니다. fetchedResultController가 nil 인 경우. – shannoga

+0

@shannoga : 아마도 performFetch 및 reloadData를 트리거하는보기 컨트롤러 (예 : viewWill/DidAppear)에 뭔가가 있습니다. 대리인을 지정할 때 FRC는 * 자동으로 * 다시 가져 오지 않습니다 *. –

답변

0

?

가져온 결과 컨트롤러를 처음 만들 때에 만 가져옵니다. 그런 다음 변경 사항이 발생할 때 데이터베이스의 모든 개체에 대한 변경 내용이 통보되고 개체를 결과 목록에 추가하거나 제거할지 여부를 평가합니다. 두 번째 가져 오기를 수행하지 않습니다 (메모리 부족 경고가 표시되는 경우는 예외).

가져 오기 속도가 느리므로 플래시 메모리를 읽어야하며 그 시간은 밀리 초가 걸립니다. 그러나 객체가 변경 될 때 RAM에 있으므로 작업에는 나노초 밖에 걸리지 않습니다. 이것이 sqlite 데이터베이스를 보지 않으려 고 노력하는 이유입니다.

tableView와 fetchedResultsController간에 충돌을 일으킬 수있는 함정이 있습니까?

확실하지 않습니다. 테스트에서 문제를 발견하지 못했다면 문제가 없다고 생각해야합니다. 하지만 iOS 8 베타 버전이 내년 중순에 출시되면 신중하게 다시 테스트해야합니다. 그러면 공개하기 전에 문제를 해결할 수 있습니다.

RAM 사용에 대해 걱정이된다면 가져온 결과 컨트롤러를 파괴해야합니다. 그러나 사용자가 다시 앱으로 전환하면 다시 생성하는 데 상당한 시간이 걸립니다.

2

불러 온 결과 컨트롤러는 다음과 같은 기능을 제공합니다

선택적으로 연관된 관리 개체 컨텍스트의 개체에 대한 변경 사항을 모니터링하고, 그 대리인에게 결과 집합의 변화를보고 ("컨트롤러의 위임"참조). 선택적으로 계산 결과를 캐시하여 동일한 데이터가 이후에 다시 표시되는 경우 작업을 반복하지 않아도됩니다 ("캐시"참조). 컨트롤러에는 대리자가 있는지 여부와 캐시 파일 이름이 설정되었는지 여부에 따라 결정되는 세 가지 작업 모드가 있습니다.

추적 안 함 : 위임은 nil로 설정됩니다. 컨트롤러는 단순히 가져 오기가 실행될 때와 마찬가지로 데이터에 대한 액세스를 제공합니다.

메모리 전용 추적 : 위임자가 0이 아니며 파일 캐시 이름이 nil로 설정됩니다. 컨트롤러는 결과 집합의 개체를 모니터링하고 관련 변경 사항에 대한 응답으로 섹션 및 주문 정보를 업데이트합니다.

전체 지속 추적 : 대리인 및 파일 캐시 이름이 nil이 아닙니다. 컨트롤러는 결과 집합의 개체를 모니터링하고 관련 변경 사항에 대한 응답으로 섹션 및 주문 정보를 업데이트합니다. 컨트롤러는 계산 결과의 영구 캐시를 유지합니다.

관련 문제