#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 запросов почти одновременно, так что, возможно, соединение может обслуживать несколько запросов одновременно…