Хобрук: Ваш путь к мастерству в программировании

NSOperationQueue Пауза и возобновление?

Я реализовал пул потоков, используя NSOperationQueue. В котором я установил maxConcurrentOperationCount на 25. то есть одновременно выполняется 25 потоков.

Я загружаю куски на сервер, используя этот файл NSOperationQueue. Таким образом, куски выделяются первым 25 потокам. После того, как NSOperationQueue заполнится, я хочу приостановить часть чтения фрагментов, а затем всякий раз, когда потоки из очереди завершатся, возобновить часть фрагментации, чтобы выделить новые потоки для NSOperationQueue, чтобы заменить поток, который завершился.

Мой код:

NSOperationQueue *operationQueue = [NSOperationQueue new];
operationQueue.maxConcurrentOperationCount=5;

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self                                                                         selector:@selector(upload:)                                                                            object:f_objChunkDetails->FileStream];

NSUInteger oprCnt=operationQueue.operationCount;

if(oprCnt >= 5) {
    // wait till queue has a free slot
} else {
    [operationQueue addOperation:operation];
}

Итак, как пауза и возобновление используются в NSOperationQueue? Как реализовать ManualResetEvent в Objective-C?


Ответы:


1

Не ждите и не делайте пауз. Вместо этого переместите создание задания (и проверку) в новый метод. Этот метод должен циклически создавать задания до доступного предела, а затем возвращаться. К каждому создаваемому заданию должен быть добавлен completionBlock, который вызывает метод создания задания.

Таким образом, вы срабатываете по событию вместо блокировки.

Как правило, completionBlock должен перейти в основной поток перед вызовом метода создания задания.

19.03.2014
  • В настоящее время я выполняю загрузку части с помощью NSOperationQueue, поэтому загрузка данных на сервер требует времени. И данные, которые собираются загрузить, поступают из класса ReadData, который выполняется быстро.. Поэтому я хочу приостановить ReadData до тех пор, пока у NSOperationQueue не будет места, если в очереди есть место ReadData начинает работать, и следующие данные назначаются NSOperationQueue. В С# это достигается с помощью класса ManualResetEvent. Какое возможное решение для задачи-c? Как мы можем добиться ManualResetEvent для нескольких потоков? 20.03.2014
  • Если вам не нравится мое решение выше, вы можете использовать NSConditionLock. 20.03.2014
  • Мне нравится ваше решение, но есть ли другой способ сделать это. Мне нужно приемлемое решение. NSConditionLock или NSLock совместно используют ресурсы... Я хочу приостановить и возобновить каждый поток отдельно. Насколько мне известно, NSConditionLock этого не добьется. Если вы считаете, что NSConditionLock - лучший вариант, то можете ли вы предоставить мне пример кода. .. Как и в c #, мы используем класс ManualResetEvent, который использует метод set, Reset, waitOne для паузы и возобновления... Какой вариант подходит для target-c (MAC). Пожалуйста, дайте ценное предложение... 24.03.2014
  • Мой ответ - возможное неблокирующее решение. Если вам нужно блокирующее решение, то NSConditionLock можно использовать в качестве семафора-счетчика. Как и dispatch_semaphore_t. 24.03.2014
  • Новые материалы

    Понимание СТРУКТУРЫ ДАННЫХ И АЛГОРИТМА.
    Что такое структуры данных и алгоритмы? Термин «структура данных» используется для описания того, как данные хранятся, а алгоритм используется для описания того, как данные сжимаются. И данные, и..

    Как интегрировать модель машинного обучения на ios с помощью CoreMl
    С выпуском новых функций, таких как CoreML, которые упростили преобразование модели машинного обучения в модель coreML. Доступная модель машинного обучения, которую можно преобразовать в модель..

    Создание успешной организации по науке о данных
    "Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

    Технологии и проблемы будущей работы
    Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

    Игорь Минар из Google приедет на #ReactiveConf2017
    Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

    Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
    Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..