2014-11-21 86 views
5

我有一個應用程序,我必須下載大量的文件,從400到900個文件,總共大約1GB。在iOS中下載大量文件在後臺iOS

哪個是最好的方法來完成這個?

  1. 其中一個NSURLSession和所有的任務排入其中?
  2. 一個NSURLSession並按包排隊任務(例如10乘10)?
  3. 多個NSURLSession不同隊列?

其實我在所有任務(每個文件一個)中有一個NSURLSession排隊,但有時我得到Lost connection to background transfer service

這裏是我的代碼:

if([[UIDevice currentDevice] isMultitaskingSupported]) 
{ 
    __block UIBackgroundTaskIdentifier bgTask; 

    UIApplication *application = [UIApplication sharedApplication]; 

    bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ 

     [application endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     NSString *uuidString; 
     CFUUIDRef uuid = CFUUIDCreate(nil); 
     uuidString = CFBridgingRelease(CFUUIDCreateString(nil, uuid)); 
     CFRelease(uuid); 
     //   } 

     NSURLSessionConfiguration *sessionConfiguration; 

     if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) 
     { 
      sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.fiveflamesmobile.bakgroundDownload"]; 
     } 
     else 
     { 
      sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.fiveflamesmobile.bakgroundDownload"]; 
     } 
     sessionConfiguration.HTTPMaximumConnectionsPerHost = 5; 
     sessionConfiguration.sessionSendsLaunchEvents = YES; 
     sessionConfiguration.discretionary = YES; 
     sessionConfiguration.timeoutIntervalForResource = 0; //NO timeout 
     sessionConfiguration.timeoutIntervalForRequest = 0; //No timeout 
     sessionConfiguration.networkServiceType = NSURLNetworkServiceTypeBackground; 

     self.session = [NSURLSession sessionWithConfiguration:sessionConfiguration 
                delegate:self 
               delegateQueue:nil]; 

     NSLog(@"##### ------- Sesion created succesfully"); 

     // [self batchDownloading]; 

     for (id<FFDownloadFileProtocol> file in self.selectedCatalogProducto.downloadInfo.arrayFiles) 
     { 
      [self startDownloadFile:file]; 
     } 

     NSLog(@"##### ------- Download tasks created successfully ------"); 

     [application endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }); 
} 

} 
+0

'一個NSURLSession和排隊的任務由包(10×10爲例)? '聽起來不錯。 – 2014-11-21 13:19:46

+0

@AnoopVaidya你爲什麼這麼說?他應該創建單個後臺會話並將其下載任務添加到該會話中。我認爲10x10方法沒有價值。 – Rob 2014-11-21 13:45:26

+0

你是否可以下載後臺的所有文件? – Mahesh 2016-06-03 15:06:17

回答

1

一個NSURLSession - 因爲你只需要處理基於會話的事情只是一次(AUTH爲例)。

一個NSOperationQueue - 同時運行多個操作。 (請參閱屬性operationCount)。第一次實施NSOperation可能有點棘手,但我相信這將是你最好的選擇。 https://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSOperationQueue_class/index.html

http://nshipster.com/nsoperation/

哦,順便說一下,這是一個高度面向對象的方法,這總是好的=)

+2

不,不,不!我是'NSOperation'中包裝網絡請求的巨大粉絲,但這是唯一的情況,你絕對不會這樣做。後臺會話配置是指在應用程序終止後以及'NSOperationQueue'及其關聯的'NSOperation'對象被銷燬後,請求繼續運行很長時間的配置。此外,與標準會話配置對象不同,「maxConcurrentOperationCount」提供了真正的價值,在這裏它只是擋道而已。通過後臺會話,您想要立即實例化所有下載請求! – Rob 2014-11-21 22:48:18

+0

好的,這是很有道理的。這樣,即使應用程序暫停,網絡請求應繼續加載。對?可悲的是,由於那個人需要有兩種不同的方式來實現下載。操作方式只適用於後臺會話,對吧? – fat 2014-11-22 09:27:00

+0

不僅在應用程序暫停時,而且即使在應用程序完全終止後(例如,如果操作系統由於內存壓力而拋棄它),後臺任務也會繼續運行。後臺守護進程知道的唯一事情就是任務,任何操作隊列(以及隊列中的任何待處理事項)都將很快消失。所以操作隊列對於前臺會話來說非常棒,但只會干擾後臺會話。所以「操作方式只適用於」_non-background_(即默認或臨時)會話。 (我想這就是你想說的,哈哈。) – Rob 2014-11-22 10:02:26