2016-12-01 26 views
9

Przy pierwszym uruchomieniu aplikacji chcę pobrać wszystkie pliki z serwera i chcę kontynuować pobieranie, nawet gdy użytkownik opuszcza aplikację (nie jest na pierwszym planie). Pliki, które muszę pobrać, to miniatury, zdjęcia w oryginalnym rozmiarze, inne pliki i wideo. Chcę je pobrać w kolejności, jak napisałem wcześniej.Pobierz wiele plików (zdjęć, filmów) w tle z priorytetową kolejnością

Używam Alamofire i ustawić menedżera sesji:

let backgroundManager: Alamofire.SessionManager = { 
    let bundleIdentifier = "com....." 
    return Alamofire.SessionManager(
     configuration: URLSessionConfiguration.background(withIdentifier: bundleIdentifier + ".background") 
    ) 
    }() 

Następnie używam go tak:

self.backgroundManager.download(fileUrl, to: destination) 
    .downloadProgress { progress in 
     //print("Download Progress: \(progress.fractionCompleted)") 
    } 
    .response(completionHandler: result) 

Jest w metodzie downloadPhoto i wzywam go:

for item in items { 
     self.downloadPhoto(item: item, isThumbnail: true, shouldReloadData: false, indexPath: nil) 
     self.downloadPhoto(item: item, isThumbnail: false, shouldReloadData: false, indexPath: nil) 
} 

Następnie mógłbym dodać wezwanie do pobrania pliku i pobrania wideo i inne. Ale wszystkie te prośby mają ten sam priorytet i chciałbym najpierw pobrać miniatury (ponieważ to właśnie widzi na początku), a następnie obrazy w pełnym rozmiarze, a potem wszystkie zdjęcia są pobierane, a następnie pliki i filmy. Ale wszystko musi być w kolejce, ponieważ jeśli użytkownik uruchomi aplikację, a następnie ustawi ją w tle i pozostawi na kilka godzin, wszystkie muszą zostać pobrane. czy to możliwe? I jak mogę to zrobić?

Patrzyłem na alamofire, że ma bibliotekę komponentów AlamofireImage, która ma priorytetowe pobieranie, ale obrazy są tylko częścią plików, które chcę nadać priorytet. Dziękujemy za pomoc.

+0

tylko uwaga: jako użytkownik nie chciałbym, że aplikacja w tle wykorzystania wszystkich Mey transmisji danych telefon do pobrania wszystkie te rzeczy. Czy planowałeś poinformować użytkownika o tym pobraniu? lub tylko w trybie wifi? – muescha

Odpowiedz

2

Zobacz TWRDDownloadManager. Używa trybu NSURLSessionDownloadTask i obsługuje także tryby tła .

Co trzeba zrobić, to:

1. Set HTTPMaximumConnectionsPerHost do 1, aby mieć pewność, że pobieranie zdarzyć seryjnie:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
configuration.timeoutIntervalForRequest = 30.0; 
configuration.HTTPMaximumConnectionsPerHost = 1; // Note this 

2. Po to metoda, która iteracyjne dla zapętlaj i pobieraj nośniki jeden po drugim:

-(void)downloadDocuments 
{ 
    for(int i=0; i<[arrDownloadList count]; i++) 
    { 
     Downloads *download = [arrDownloadList objectAtIndex:i]; 
     NSString *fileURL = download.documentURL; 

     [[TWRDownloadManager sharedManager] downloadFileForURL:fileURL 
                 withName:[fileURL lastPathComponent] 
               inDirectoryNamed:kPATH_DOC_DIR_CACHE_DOCUMENTS 
               completionBlock:^(BOOL completed) 
     { 
      if (completed) 
      { 
       /* To some task like database download flag updation or whatever you wanr */ 

       downloadIndex++; 

       if(downloadIndex < [arrDownloadList count]) { 
        [self updateDownloadingStatus]; 
       } 
       else { 
        [self allDownloadCompletedWithStatus:TRUE]; 
       } 
      } 

      else 
      { 
       /* Cancel the download */ 
       [[TWRDownloadManager sharedManager] cancelDownloadForUrl:fileURL]; 

       downloadIndex++; 

       if(downloadIndex < [arrDownloadList count]) { 
        [self updateDownloadingStatus]; 
       } 
       else { 
        [self allDownloadCompletedWithStatus:TRUE]; 
       } 
      } 

     } enableBackgroundMode:YES]; 
    } 
} 

Nie zapomnij włączyć tryb tła: enableBackgroundMode:YES

3. Włącz Background Modes w Xcode:

enter image description here

4. Dodaj następującą metodę do AppDelegate:

- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler{ 
    [TWRDownloadManager sharedManager].backgroundTransferCompletionHandler = completionHandler; 
} 

Jeśli to zrobisz, pobieranie odbędzie się seryjnie i będzie kontynuowane, nawet jeśli aplikacja jest w tle lub użytkownik zablokuje urządzenie.

Dodaj komentarz w przypadku jakichkolwiek pytań lub pomocy dotyczących tego.

2

Uważam, że pomoże Ci iOS standard URLSessionDownloadTask.Ma właściwość priority, która wygląda tak, jak potrzebujesz.

Oto oficjalny documentation

Oto tutorial