2016-08-02 6 views
1

Wie setze ich den Download-Vorgang nach einer Verzögerung fort?Erneuter Versuch eines fehlgeschlagenen Downloads in URLSession: task: didCompleteWithError

hatte ich einen Blick auf diesen Thread:

iOS NSURLSession, how to retry in didCompleteWithError

Der dritte Ansatz von Rob vorgeschlagen ist, was ich versuche, zu tun, aber ich weiß nicht, wie eine Zeitverzögerung einstellen.

Bisher Ich habe so etwas wie dies:

-(void)URLSession:(NSURLSession*)session task:(NSURLSessionTask*)task didCompleteWithError:(NSError*)error { 
    if (error == nil) 
    return; 

    NSData* resume_data = error.userInfo[NSURLSessionDownloadTaskResumeData]; 
    NSURLSessionDownloadTask* new_task = [_session downloadTaskWithResumeData:resume_data]; 
    [new_task resume]; 
} 

würde Ich mag 10 Sekunden warten (sagen wir) und dann wieder auf.

Antwort

1

Wenn [new_task resume] funktioniert, dann so wird:

[new_task performSelector:@selector(resume) withObject:nil afterDelay:10.0] 
+0

Bitte beachten Sie, dass 'performSelector: withObject: afterDelay:' wird nicht funktionieren, wenn von einem Hintergrund-Thread aufgerufen. versuchen Sie es mit dispatch_after, es funktioniert von welchem ​​Thread (obwohl es auch ein paar Vorbehalte). – OlDor

+0

danke. Dies löste das unmittelbare Problem, eine Funktion nach einer Verzögerung aufzurufen. – Ash

2

Sie sollten es nicht nach einer Verzögerung wieder aufzunehmen. Das führt dazu, dass Ihre App viele Ressourcen verwendet, wenn keine Netzwerkverbindung besteht.

Verwenden Sie stattdessen reachability, um festzustellen, wann es angemessen ist, es erneut zu versuchen. Erstellen Sie ein Erreichbarkeitsobjekt für den genauen Host von der ursprünglichen URL, und wiederholen Sie die Anforderung, wenn dieses Erreichbarkeitsobjekt angibt, dass der Host erreichbar ist.

+0

Danke. Ich habe die Erreichbarkeit implementiert. – Ash

Verwandte Themen