我正在嘗試爲我們的應用程序創建一個簡單的下載器。該應用程序將從我們的服務器下載大文件(每個文件至少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個下載任務將同時開始下載。
我真的很感激,如果任何人都可以幫助我確定我的代碼有什麼問題。
這不是一個真正的大問題,如果這是正常的行爲。我只是認爲我可能做錯了什麼,因爲我已經看到使用NSURLSession backgroundSessionConfigurationWithIdentifier下載多個文件的項目,它們都開始同時下載。這個項目就是一個例子:https://www.raywenderlich.com/110458/nsurlsession-tutorial-getting-started –
如果你設置'shouldUseExtendedBackgroundIdleMode',它*可能會更願意這樣做,但我不會當然。另一個竅門是所有的併發限制都是每會話,IIRC,所以如果你爲每個請求創建單獨的後臺會話...有點噁心,但它可能會得到你想要的結果。無論是否值得做,我都不能說。 :-D – dgatwood
似乎它確實將連接限制在4 max,並且誠實地說,因爲這不是一個大問題,我會保持原樣。我會將你的回答標記爲正確的,因爲你對我的問題給出了非常合理的答案。感謝您的幫助! –