이 시나리오의 :코어 - 데이터 + AFNetworking + UI의 업데이트 (대응) 여기
나는 DownloadManager
을 쓰고, 그 사용자가, 일시 중지, 다운로드 취소, 모든 다운로드, 모든 일시 정지 할 수 있습니다. DownloadManager
은 싱글 톤이며 AFNetworking
을 사용하여 파일을 다운로드합니다. 자체 관리 객체 컨텍스트를 가지고있어서 사용자가 코어 데이터 객체 추가, 편집, 삭제를 통해 응용 프로그램의 다른 부분을 자유롭게 사용할 수 있습니다. 나는 다운로드 정보, 즉 fileURL
, fileSize
, bytesRead
등을 저장하는 코어 데이터 엔티티 DownloadInfo
을 가지고 있습니다. DownloadManager
은 다운로드 진행률을 DownloadInfo
(각 파일마다 하나씩)으로 업데이트합니다.
나는 DownloadManagerViewController
을 사용하여 NSFetchedResultsController
을 사용하여 다운로드 상태를 사용자에게 보여줍니다. 이 다운로드보기 컨트롤러는 기본 관리 객체 컨텍스트를 사용하고 있습니다.
이제 다운로드 대기열에 20 개의 파일이 있다고 가정 해 보겠습니다. 그리고 3 개의 동시 다운로드 만 허용된다고 가정 해 봅시다. 다운로드 관리자는 파일을 다운로드하고 다운로드 진행률을 표시해야합니다.
문제점 :
DownloadInfo
개체는 매우 높은 속도로 DownloadManager
의해 갱신하고있다. DownloadManagerViewController
(다운로드 진행 상태 표시)은 NSFetchedResultsControllerDelegate
메소드를 사용하여 목록을 업데이트합니다. 결과적으로 메인 큐에서 많은 일이 일어나고 있으며 애플리케이션의 반응이 매우 좋지 않습니다.
어떻게 해결할 수 있습니까? 다운로드 진행률을 표시하면서 어떻게 반응 형 응용 프로그램을 만들 수 있습니까? 내가 DownloadManager
과 DownloadManagerViewController
사이의 다운로드 상태 있음을 통신하는 방법 밖에 모르는
. 이것을 할 수있는 또 다른 방법이 있습니까?
위에 언급 된 이유 때문에 내
DownloadManager
에 주된 관리 객체 컨텍스트를 사용하고 싶지 않습니다.DownloadManager
은 요청을 비동기 적으로 처리하는AFNetworking
을 사용하지만 결국DownloadInfo
개체는 콜백 메소드의 결과로 메인 스레드에서 업데이트됩니다. 백그라운드 스레드에서 다운로드 및 상태 업데이트 작업을 처리하는 방법이 있습니까? 하지만 어떻게? 메인 쓰레드와 백그라운드 쓰레드 사이에서 어떻게 통신 할 것인가? 즉, 백그라운드 쓰레드가 다른 파일을 다운로드 할 수 있도록 대기시키는 방법은 무엇입니까?
감사합니다.
실제로 어떤 업데이트 정보를 화면에 표시해야합니까? – Wain
파일 이름과 함께 다운로드 진행률 (즉, 다운로드 한 x의 x) - 기본적으로. 파일 크기는 몇 KB에서부터 MB까지 다양 할 수 있으므로 새 파일을 추가하거나 파일 다운로드를 완료하거나 매주마다 파일 다운로드를 시작하고 매 초마다 업데이트해야 화면을 새로 고쳐야합니다. 다운로드 진행 상태를 표시하기 위해 매 3-5 초마다 최신 다운로드 상태 즉 업데이트 화면을 표시하지 않는 것으로 절충 할 수 있습니다. – Mustafa