2015-03-08 3 views
1

Идеиограничить количество одновременных загрузок в AFURLSessionManager

Я строй файлы менеджер загрузки с помощью AFNetworking и я использую класс AFURLSessionManager. приложение должно загружать mp3-файлы с сервера.

Я был обеспокоен памятью потребляющей, так что я пытаюсь ограничить количество одновременных загрузок в 1.

Я знаю, что есть свойство NSOperationQueue в AFURLSessionManager называется operationQueue и он ограничен 1 работы при time по умолчанию. Так что я добавляю свою NSURLSessionDownloadTask к операцииQueue.

проблема

код не работает. файлы загружаются одновременно, а не один за другим.

код

// 1. build sessionManager and prepare some vars 
// note: by testing i found that it's better to init NSURLSessionConfiguration with backgroundSessionConfigurationWithIdentifier for memory issues 
NSURLSessionConfiguration *conf = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"special_Identifier"]; 
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:conf]; 
NSURL *urlDocs     = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory 
                     inDomain:NSUserDomainMask 
                   appropriateForURL:nil 
                      create:NO 
                      error:nil]; 
__block NSProgress *progress = Nil; 

// 2. open sessionManager operation Queue and add this new download 
[manager.operationQueue addOperationWithBlock:^{ 
    // 2.1 init new download request 
    NSURLRequest *request = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:fileLink]]; 

    // 2.2 creat a NSURLSessionDownloadTask 
    NSURLSessionDownloadTask *downloadTask = [self.downloadManager downloadTaskWithRequest:request progress:&progress 
                       destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { 
                        return [urlDocs URLByAppendingPathComponent:fileName]; 
                       } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { 
                        if (!error) { 
                         NSLog(@"done: %@", filePath); 
                        }else{ 
                         NSLog(@"error %@",error); 
                        } 
                       }]; 

    // 2.3 start downloading 
    [downloadTask resume]; 

    // 2.4 track downloading progress using KVO 
    [progress addObserver:self 
       forKeyPath:NSStringFromSelector(@selector(fractionCompleted)) 
        options:NSKeyValueObservingOptionNew 
        context:(__bridge void *)(fileLink)]; 
}]; 

ответ

0

В AFNetworking 2 (и AFNetworking 3), вы можете инициализировать ваш AFHTTPSessionManager с NSURLSessionConfiguration (используйте AFHTTPSessionManager initWithBaseURL:sessionConfiguration:). Там вы можете указать количество подключений на хост (HTTPMaximumConnectionsPerHost).

Пример:

NSURL *url = [NSURL URLWithString:@"myurl.net"]; 
NSURLSessionConfiguration *configuration = NSURLSessionConfiguration.defaultSessionConfiguration; 
configuration.HTTPMaximumConnectionsPerHost = 1; 
AFHTTPSessionManager *sessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:url sessionConfiguration:sessionConfiguration]; 

Документация:

Смежные вопросы