2016-10-03 183 views
0

我正在嘗試爲我們的應用程序創建一個簡單的下載器。該應用程序將從我們的服務器下載大文件(每個文件至少100 MB),所以我想實現一個即使應用程序處於非活動狀態也可以工作的下載程序。在[NSURLSession backgroundSessionConfigurationWithIdentifier]上設置最大http連接不起作用

我使用NSURLSession來處理此請求。下面是如何初始化會話:

@property (nonatomic) NSURLSession *downloadSession; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // Initialise the session 
    NSURLSessionConfiguration *sessionConfig = [NSURLSession backgroundSessionConfigurationWithIdentifier: @"backgroundSessionIdentifier"]; 
    [sessionConfig setHTTPMaximumConnectionsPerHost:10]; 

    _downloadSession = [NSURLSession sessionWithConfiguration: sessionConfig delegate: self delegateQueue: nil]; 
} 

我也實現了以下NSURLSessionDownloadDelegate功能檢查每個下載的進度:

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { 
    float totalProgress = (float)totalBytesWritten/(float)totalBytesExpectedToWrite; 
    NSLog(@"URL: %@, progress: %f", downloadTask.originalRequest.URL.absoluteString, totalProgress); 
} 

我有一個UICollectionView和每個單元都有一個按鈕,將創建一個點擊下載任務:

// A delegate function of the custom UICollectionViewCell 
- (void)beginDownloadAtIndex:(NSInteger)fileIndex { 
    NSString *fileURL = [self.urls objectAtIndex: fileIndex]; 
    NSURLSessionDownloadTask *downloadTask = [self.downloadSession downloadTaskWithURL: [NSURL URLWithString: fileURL]]; 
    [downloadTask resume]; 
} 

現在說我有UICollectionView中的10個項目。我將HTTPMaximumConnectionsPerHost設置爲10,以便我可以同時下載它們。

會發生什麼是我創建的前3個下載任務將同時開始下載,但其他7個不會。當前3個下載任務中的一個完成後,其中一個「休眠」下載任務將開始下載。

我可能做錯了什麼,因爲當我嘗試使用默認會話配置[NSURLSessionConfiguration defaultSessionConfiguration]時,所有10個下載任務將同時開始下載。

我真的很感激,如果任何人都可以幫助我確定我的代碼有什麼問題。

回答

0

背景會話在單獨的背景守護進程中發生進程外。蘋果似乎很有可能故意限制改變該參數的能力,以防止在應用程序不運行時出現異常大量的傳輸。

您可以向Apple提交錯誤消息,但我懷疑他們會將其發回爲「正確行爲」。

這就是說,我不確定你想通過使用大量的並行下載來實現什麼。除非出現異常高的數據包丟失或由ISP故意限制(例如突發模式),平均每次運行10次大容量下載和平均每次運行10次應該沒有多大區別。

+0

這不是一個真正的大問題,如果這是正常的行爲。我只是認爲我可能做錯了什麼,因爲我已經看到使用NSURLSession backgroundSessionConfigurationWithIdentifier下載多個文件的項目,它們都開始同時下載。這個項目就是一個例子:https://www.raywenderlich.com/110458/nsurlsession-tutorial-getting-started –

+0

如果你設置'shouldUseExtendedBackgroundIdleMode',它*可能會更願意這樣做,但我不會當然。另一個竅門是所有的併發限制都是每會話,IIRC,所以如果你爲每個請求創建單獨的後臺會話...有點噁心,但它可能會得到你想要的結果。無論是否值得做,我都不能說。 :-D – dgatwood

+0

似乎它確實將連接限制在4 max,並且誠實地說,因爲這不是一個大問題,我會保持原樣。我會將你的回答標記爲正確的,因爲你對我的問題給出了非常合理的答案。感謝您的幫助! –