Как maxConcurrentOperationCount задачи NSURLSession delegateQueue влияет на согласованность задач

#ios #objective-c #multithreading #cocoa-touch #afnetworking

#iOS #objective-c #многопоточность #cocoa-touch #afnetworking

Вопрос:

Я использую AFNetworking 3.0, который использует NSURLSessionDataTask , а также OperationQueue (свойство AFURLSessionManager ), которое используется в качестве delegateQueue для NSURLSession

проще говоря

AFURLSessionManager.operationQueue == NSURLSession.delegateQueue

Код AFNetworking 3

 self.operationQueue = [[NSOperationQueue alloc] init];
self.operationQueue.maxConcurrentOperationCount = 1;
self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];
  

из документов Apple. для NSURLSession delegateQueue

Очередь операций для планирования вызовов делегатов и обработчиков завершения. Очередь не обязательно должна быть последовательной очередью. Если nil, сеанс создает очередь последовательных операций для выполнения всех вызовов метода делегирования и вызовов обработчика завершения.

self.operationQueue.maxConcurrentOperationCount = 4; означает ли установка, что будет max. одновременно обрабатывается 4 NSURLSessionDataTask ? и установка для нее значения = 1 (по умолчанию для AFNetworking) означает, что в данный момент существует только одна задача, и она должна завершиться для начала другой?

Или я ошибаюсь, и это влияет только на доставку сообщений делегата, что означает, что установка его на 4 может вызвать обратный вызов делегата в 4 разных потоках … а установка на 1 означает, что обратный вызов всегда выполняется в одном потоке, но задачи в любом случае обрабатываются одновременно

Комментарии:

1. Есть ли опечатка в приведенной выше цитате из документов Apple? Вместо «Очередь не обязательно должна быть последовательной очередью» должно быть «Очередь должна быть последовательной очередью». Это настолько очевидно, что я не решаюсь его редактировать, опасаясь, что я чего-то не хватает. developer.apple.com/documentation/foundation/nsurlsession /…

Ответ №1:

Эта очередь является очередью делегатов, поэтому она должна влиять только на доставку сообщений делегатов.

Когда вы создаете NSURLSession , вы присваиваете ему объект конфигурации типа NSURLSessionConfiguration .

NSURLSessionConfiguration включает свойство HTTPMaximumConnectionsPerHost , которое позволяет вам контролировать количество одновременных подключений к одному хосту. Это единственный известный мне механизм, который позволяет вам контролировать количество подключений.

Комментарии:

1. отлично, спасибо, что указали на HTTPMaximumConnectionsPerHost, это также должно быть отражено в AFNetworking, поскольку свойство OperationQueue вводит в заблуждение

2. Я только что опубликовал комментарий к вашему комментарию на этой плате github. Дело не в том, что свойство OperationQueue AFNetworking не должно быть общедоступным; это то, что оно плохо названо и, следовательно, вводит в заблуждение и сбивает с толку.

3. кстати. HTTPMaximumConnectionsPerHost = 1, похоже, не поддерживает одно единственное соединение одновременно, даже похоже, что оно игнорируется, потому что, когда я выполняю 100 запросов в цикле, сервер получает 100 запросов почти одновременно, так что, возможно, соединение может обслуживать несколько запросов одновременно…