2016-10-26 5 views
0

Ich verwende [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response){}], um etwas herunterzuladen.Kann Datei nicht gelesen werden, wenn NSProgress zeigt abgeschlossen?

Ich lese heruntergeladene Datei, wenn progress.fractionCompleted == 1 mit KVO. Und ich finde, dass etwas, das ich eine null bekomme, wenn ich die Datei lese.

So möchte ich wissen, wenn ich Datei lesen kann. Und Fortschritt abgeschlossen bedeutet, vollständig Datei auf der Festplatte schreiben oder nur erhalten alle Daten.

EDIT

- (void)URLSession:(__unused NSURLSession *)session 
     downloadTask:(__unused NSURLSessionDownloadTask *)downloadTask 
     didWriteData:(__unused int64_t)bytesWritten 
totalBytesWritten:(int64_t)totalBytesWritten 
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite 
{ 
    self.progress.totalUnitCount = totalBytesExpectedToWrite; 
    self.progress.completedUnitCount = totalBytesWritten; 
} 

So sollte es Datei zuerst schreiben dann Fortschritte einstellen? Aber warum bekomme ich ein Nil ???

Antwort

1

Es ist in Ordnung, den Fortschritt in Ihrer Delegate-Methode zu verfolgen, wenn Sie dem Benutzer eine Art Fortschritt anzeigen möchten. Aber das ist nicht wie Sie wissen, wann die Datei zu greifen.

Der Weg zu wissen, wann Sie die Datei greifen können, ist, wenn die Delegate-Methode URLSession:downloadTask:didFinishDownloadingToURL: ausgelöst wird. Sie müssen die Datei in dieser Delegate-Methode greifen.

Und Sie müssen es tun sofort. Sie können KVO nicht dazwischen verwenden, da in dem Intervall zwischen dem Moment, in dem die Delegate-Methode ausgelöst wird, und dem Moment, an dem Sie über KVO benachrichtigt werden, die Datei möglicherweise zerstört wird. Es ist zerstört, wenn wir von URLSession:downloadTask:didFinishDownloadingToURL: zurückgeben. Deshalb müssen Sie es innerhalb dieser Methode greifen, und nirgendwo sonst.

+0

Vielen Dank! – Tepmnthar

Verwandte Themen