2013-06-29 3 views
2

이 시나리오의 :코어 - 데이터 + AFNetworking + UI의 업데이트 (대응) 여기

나는 DownloadManager을 쓰고, 그 사용자가, 일시 중지, 다운로드 취소, 모든 다운로드, 모든 일시 정지 할 수 있습니다. DownloadManager은 싱글 톤이며 AFNetworking을 사용하여 파일을 다운로드합니다. 자체 관리 객체 컨텍스트를 가지고있어서 사용자가 코어 데이터 객체 추가, 편집, 삭제를 통해 응용 프로그램의 다른 부분을 자유롭게 사용할 수 있습니다. 나는 다운로드 정보, 즉 fileURL, fileSize, bytesRead 등을 저장하는 코어 데이터 엔티티 DownloadInfo을 가지고 있습니다. DownloadManager은 다운로드 진행률을 DownloadInfo (각 파일마다 하나씩)으로 업데이트합니다.

나는 DownloadManagerViewController을 사용하여 NSFetchedResultsController을 사용하여 다운로드 상태를 사용자에게 보여줍니다. 이 다운로드보기 컨트롤러는 기본 관리 객체 컨텍스트를 사용하고 있습니다.

이제 다운로드 대기열에 20 개의 파일이 있다고 가정 해 보겠습니다. 그리고 3 개의 동시 다운로드 만 허용된다고 가정 해 봅시다. 다운로드 관리자는 파일을 다운로드하고 다운로드 진행률을 표시해야합니다.

문제점 :

DownloadInfo 개체는 매우 높은 속도로 DownloadManager 의해 갱신하고있다. DownloadManagerViewController (다운로드 진행 상태 표시)은 NSFetchedResultsControllerDelegate 메소드를 사용하여 목록을 업데이트합니다. 결과적으로 메인 큐에서 많은 일이 일어나고 있으며 애플리케이션의 반응이 매우 좋지 않습니다.

어떻게 해결할 수 있습니까? 다운로드 진행률을 표시하면서 어떻게 반응 형 응용 프로그램을 만들 수 있습니까? 내가 DownloadManagerDownloadManagerViewController 사이의 다운로드 상태 있음을 통신하는 방법 밖에 모르는

  1. . 이것을 할 수있는 또 다른 방법이 있습니까?

  2. 위에 언급 된 이유 때문에 내 DownloadManager에 주된 관리 객체 컨텍스트를 사용하고 싶지 않습니다. DownloadManager은 요청을 비동기 적으로 처리하는 AFNetworking을 사용하지만 결국 DownloadInfo 개체는 콜백 메소드의 결과로 메인 스레드에서 업데이트됩니다. 백그라운드 스레드에서 다운로드 및 상태 업데이트 작업을 처리하는 방법이 있습니까? 하지만 어떻게? 메인 쓰레드와 백그라운드 쓰레드 사이에서 어떻게 통신 할 것인가? 즉, 백그라운드 쓰레드가 다른 파일을 다운로드 할 수 있도록 대기시키는 방법은 무엇입니까?

감사합니다.

+0

실제로 어떤 업데이트 정보를 화면에 표시해야합니까? – Wain

+0

파일 이름과 함께 다운로드 진행률 (즉, 다운로드 한 x의 x) - 기본적으로. 파일 크기는 몇 KB에서부터 MB까지 다양 할 수 있으므로 새 파일을 추가하거나 파일 다운로드를 완료하거나 매주마다 파일 다운로드를 시작하고 매 초마다 업데이트해야 화면을 새로 고쳐야합니다. 다운로드 진행 상태를 표시하기 위해 매 3-5 초마다 최신 다운로드 상태 즉 업데이트 화면을 표시하지 않는 것으로 절충 할 수 있습니다. – Mustafa

답변

0

관리 대상 개체 컨텍스트에 대한 모든 변경 사항을 관찰하는 대신 실제로 화면을 업데이트 할 이벤트에 대한 알림을 하나 이상 구현하는 것을 고려하십시오. 알림이 백그라운드 스레드에서 게시되는 경우 UI 업데이트를 트리거하기 전에 주 스레드로 다시 전환해야합니다.

또는 FRC 대리자 메서드가 호출 될 때 실제로 변경된 내용에 대한 정보를받습니다. 이를 분석하여 가장 빈번하고 가장 의미가 적은 변경 사항을 필터링하고 UI 업데이트 결과를 막을 수 있습니다.

0

Instruments를 사용하여 ViewController에서 실제로 진행중인 작업을 보았습니까? Time Profiler는 CPU가 더 많은 시간을 보내는 곳을 알려주고 문제의 근원을 파악하는 데 도움을줍니다.이 사실을 알지 못하면 어떤 성능 조정이 필요한지 정확히 알 수 없습니다.

인스트루먼트를 사용한 후에 NSFetchedResultsController이 VC의 많은 업데이트를 강제하는 경우 CoreData에서 진행 상황을 읽지 않도록 고려해야합니다. 많은 테이블이나 뷰가 Drawing보다 CoreData에서 읽는 데 더 많은 시간을 소비하는 것을 보았습니다. 귀하의 문제가 CoreData 읽기와 같아서, 나는 NSMutableDictionary에서 진행률을 읽고 다운로드가 certan 임계 값을 통과하면 UI를 업데이트하려고합니다.