2016-03-23 3 views
1

Gibt es eine Möglichkeit, die geschätzte Zeit von On Demand Ressourcen Download zu erhalten?Auf Remand Ressourcen - Geschätzte Zeit (und wie man eine Warnung abhängig vom Download-Fortschritt zeigt)

Ich möchte eine Warnung anzeigen, bis alle heruntergeladen sind.

[alertDownload showCustom:self image:[UIImage imageNamed:@"icon.jpg"] 
           color:[UIColor blueColor] 
           title:@"Download..." 
           subTitle:@"Download in progress" 
           closeButtonTitle:nil 
           duration: ODR ETA]; 

Im Moment habe ich

if (request1.progress.fractionCompleted < 1) { 
// code above 
} 

aber der Alarm wird nicht automatisch verschwinden, wenn der Download abgeschlossen ist, wird es an der Dauer der Warnung aussehen wird.

+0

Welche API verwenden Sie, um den Download durchzuführen? Verwendet es HTTP und wenn ja, wird die 'contentLength' in der Antwort angegeben? – trojanfoe

+0

hey, ich verwende On Demand Ressourcen https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/On_DemandResources_Guide/Managing.html#//apple_ref/doc/uid/TP40015083-CH4-SW1 – fabersky

+0

OK, damit auf der Seite Code angezeigt wird, der eine Benachrichtigung verwendet, um den Download-Fortschritt zu verfolgen. Hast du es versucht? – trojanfoe

Antwort

0

Also, auch dank der Hilfe von @trojanfoe, habe ich diesen Weg erreicht.

Im Grunde stelle ich die Alarmdauer beim Erstellen der Warnung nicht ein, aber ich aktualisiere sie abhängig vom Download-Fortschritt. Bis der Download beendet ist, setze ich die Dauer wiederholt auf 20.0f. Dann, wenn der Download abgeschlossen ist, setze ich die Dauer auf 1.0f (so wird die Warnung in 1 Sekunde verschwinden).

NSTimeInterval _alertDuration; 

- (void)viewDidLoad { 
[request1 conditionallyBeginAccessingResourcesWithCompletionHandler:^ 
              (BOOL resourcesAvailable) 
    { 
    if (resourcesAvailable) { 
    // use it 
    } else { 
     [request1 beginAccessingResourcesWithCompletionHandler:^ 
              (NSError * _Nullable error) 
    { 
      if (error == nil) { 
       [[NSOperationQueue mainQueue] addOperationWithBlock:^ { 
        [alertDownload showCustom:self image:[UIImage 
          imageNamed:@"icon.jpg"] 
          color:[UIColor blueColor] 
          title:@"Download..." 
          subTitle:@"Download in progress" 
          closeButtonTitle:nil 
          duration:_alertDuration]; 
        } 
       ]; 
      } else { 
      // handle error 
      } 
     }]; 
    } 
}]; 

.

- (void)observeValueForKeyPath:(nullable NSString *)keyPath 
       ofObject:(nullable id)object 
       change:(nullable NSDictionary *)change 
       context:(nullable void *)context { 
if((object == request1.progress) && [keyPath 
       isEqualToString:@"fractionCompleted"]) { 
    [[NSOperationQueue mainQueue] addOperationWithBlock:^ { 
    if(request1.progress.fractionCompleted == 1) { 
     _alertDuration = 1.0f; 
    } else { 
     _alertDuration = 20.0f; 
    } 
    }]; 
} 
} 
1

OK, wenn Sie die Fraktion erhalten komplette Wert und Sie können Zeit messen, dann wissen Sie, wie lange Sie noch haben.

Wenn Sie den Download zu starten, um die Startzeit in einer Instanzvariablen auf:

@interface MyClass() { 
    NSTimeInterval _downloadStartTime; 
} 

- (void)startDownload 
{ 
    ... 
    _downloadStartTime = [NSDate timeIntervalSinceReferenceDate]; 
    ... 
} 

und dann in Ihren Benachrichtigungs-Handler, in dem Sie die Fraktion vollständige, Nutzung erhalten:

double fractionComplete = 0.2; // For example 
if (fractionComplete > 0.0) {  // Avoid divide-by-zero 
    NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate]; 
    NSTimeInterval elapsed = now - _downloadStartTime; 
    double timeLeft = (elapsedTime/fractionComplete) * (1.0 - fractionComplete); 
} 

Hinweis: Ich habe die Anzeige des Warndialogs nicht angepackt und ich denke nicht, dass die von Ihnen verwendete Logik funktioniert (Sie möchten nicht jedes Mal, wenn Sie ein Update erhalten, eine neue Warnmeldung anzeigen). Ich vermeide das ganze Gebiet und konzentriere mich nur auf die ETA-Logik.

+0

danke! werde es jetzt versuchen! – fabersky

+0

@fabersky Hinweis: In meiner ursprünglichen "verstrichenen" Berechnung ist ein Fehler aufgetreten. – trojanfoe

+0

ok;) aber eine Frage: Ich muss den Alarm anzeigen und seine Dauer einstellen, wenn der Download startet, also wie kann ich die verbleibende Zeit vor dem Download wissen? – fabersky

Verwandte Themen