2

dataTaskWithURL:completionHandler:을 사용하여 completionHandler 블록에서 데이터를 가져올 수는 있지만 위임 메서드가 실행되지 못하도록 차단하고 있으며 진행률 표시기를 구성하는 방법에 따라 didReceiveData: 메서드를 실행해야합니다.완성 된 'NSURLSessionDataTask`에서 데이터를 얻으려면 어떻게해야합니까?

다운로드가 완료되면 다운로드하는 방법은 완전히 망가졌습니다. 완료 블록에 해당하는 델리게이트 메서드는 무엇입니까? didCompleteWithError은 (는) NSData을 반환하지 않습니다.

didReceiveData에 수동으로 데이터를 결합 할 필요가 없습니까? 그렇습니다. 완료 핸 들러가 너에게 그걸 건네 주면 정말 안좋은 것 같아. 한 번에 50 가지 이상을 다운로드 할 수 없다는 사실이 아니라면 부분 데이터를 추적하는 것이 엉덩이의 고통처럼 보입니다. NSURLSessionDownloadTask으로 전환해야하나요?

+0

나는 당신을 도울 수있는 다운로더 클래스를 작성했다 : https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch24p842downloader/ch37p1099downloader/MyDownloader.m – matt

+0

그래서 이것은 그의 마지막 단락에서 [Rob이 참조하는] (http://stackoverflow.com/a/21925050/2005643)의 구현입니다. –

+0

너 봤어? 이전에 언급 한 내용을 보았습니까? – matt

답변

5

예, 데이터를 수동으로 조각해야합니다 (또는 실제로 크기가 커서 메모리를 차지하지 않으려는 경우 파일로 스트리밍 할 수 있음).

그래서, didReceiveData 방법은이 들어오는대로 데이터를 반환 될 것입니다. 당신이 didCompleteWithError가 호출 될 때 NSMutableData (didReceiveResponse에서, 예를 들어)가 들어 오면 didReceiveData 데이터를 추가 할 수 있습니다., 가정 인스턴스화해야 그래서 오류가 nil 인 경우 NSMutableData에 수신 된 모든 데이터가 포함되어 있다고 확신 할 수 있습니다. 당신이 지적했듯이, 도전 과제는 50 개 이상의 다운로드를 모두 추적하는 것이므로 작업 식별자로 입력 된 사전을 유지하여 데이터를 추가 할 대상을 추적합니다. (개인적으로는 NSURLSession이 각각의 작업에 대해 별도의 작업 위임 개체를 인스턴스화하는 대신 세션 수준에서 위임자를 작업, 다운로드 및 업로드하는 것이 설계상의 결함이라고 생각합니다. 그러나 우리는 우리가 가지고있는 것을 가지고 있습니다.)

방금 ​​데이터를 다운로드하는 경우 NSURLSessionDownloadTask이 좋은 대안이며 (단지 NSMutableData 인스턴스에 추가하는 것보다 메모리 사용 측면에서 더 효율적입니다), 원하는 경우 백그라운드 세션을 사용할 수도 있습니다 (NSURLSessionDataTask으로는 불가능합니다).

마지막으로 50 개 이상의 다운로드를 수행중인 경우 다운로드 작업을 NSOperation 하위 클래스로 래핑하는 것이 좋습니다. 이렇게하면 시간 제한을 두지 않고 동시에 얼마나 많은 프로그램을 실행하도록 제한 할 수 있습니다.

+0

그건 그렇고, AFNetworking의 저자는 ([issue 1504] (https://github.com/AFNetworking/AFNetworking/issues/1504) 참조) 향후 출시 될 릴리스는 'NSOperation'에'NSURLSessionTask' 객체를 래핑 할 것입니다. 하위 클래스이므로 자신의 클래스를 작성하지 않으려면 (우리 중 일부와 마찬가지로) AFNetworking 업데이트에주의를 기울이십시오. – Rob

+0

흠, 현실적으로 저는 10 살 이상을 할 수 있을지 의심 스럽습니다. NSOperations에서 포장 할 가치가 있습니까? 나는 아마 시험하고보아야 만한다고 생각합니다. –

+0

매우 교육적인 답변입니다. - 문서 작업에서는 데이터 작업을 통해 순서대로 도착할 데이터 조각에 의존 할 수 없다는 것을 알 수 있으므로 걱정할 필요가 있습니다.이 경우에는 매번 변경 될 수있는 데이터를 추가하는 것만으로는 작동하지 않습니다. – matt