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

Попытка запустить два процесса одновременно в GCD — iOS

Я пытаюсь одновременно загрузить два набора данных в фоновом режиме через GCD в iOS. В настоящее время я построил две отдельные параллельные очереди, в которых я запускаю каждую из задач. Однако задержка между завершением первой очереди и второй очереди (которые выполняют одинаково интенсивные задачи) очень велика (поэтому я предполагаю, что они не выполняются одновременно). Есть ли у вас, ребята, какие-либо предложения о том, как это исправить? Я не совсем понимаю правильный подход к этому. Спасибо!

dispatch_queue_t myQueue = dispatch_queue_create("com.a.identifier", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t myQueue2 = dispatch_queue_create("com.a.identifier2", DISPATCH_QUEUE_CONCURRENT);


dispatch_async(myQueue, ^{

    [self fetchDataWithDataFromUrl:[NSURL URLWithString:linkOne]];

    dispatch_async(dispatch_get_main_queue(), ^{

        [self.tableView reloadData];

    });

});



dispatch_async(myQueue2, ^{

    [self fetchDataWithDataFromUrl2:[NSURL URLWithString:linkTwo]];


    dispatch_async(dispatch_get_main_queue(), ^{

        [self.tableView reloadData];

    });
});

  • Между завершениями есть задержка - поэтому загружается один набор, а затем загружается следующий через 10 секунд. Я пытаюсь заставить наборы загружаться почти одновременно. 25.07.2014

Ответы:


1

Скорее всего, они работают одновременно. Они могут работать не параллельно. Важно знать разницу. GCD обеспечивает параллелизм, это мало обещания о параллелизме. Это верно для многих библиотек (и обычно это более важная функция).

Сколько у вас ядер? Если у вас только одно ядро, то неудивительно, если второе задание будет ждать завершения первого. Если у вас есть два ядра, но в основной очереди много работы, то она, скорее всего, получит приоритет перед одним из ваших блоков. Вы должны использовать инструменты GCD в инструментах, чтобы узнать, когда что-то планируется (printf также является мощным инструментом здесь). Помните, переключение контекста требует времени. Чтобы получить наилучшую пропускную способность ядра, вы хотите запустить на нем одно действие, пока оно не будет завершено, а затем запустить следующее. Переключение вперед и назад, чтобы они завершились вместе, заставит их работать медленнее. Большинство систем ориентированы на пропускную способность. Нет причин менять блок, чтобы запустить блок с таким же приоритетом.

Знаете ли вы, что оба задания получают свои данные одновременно? Если вы берете данные из сети, вполне возможно, что один из них появится намного раньше или быстрее, чем другой. Возможно, вы выполняете конвейерную обработку одного соединения, что может сериализовать сетевой трафик. Вы должны регистрировать, когда данные попадают к вам. Вы также должны регистрировать, когда ваш блок фактически начинается (поставьте printf() в верхней части блока).

Если вам нужно, чтобы первое задание дождалось завершения второго перед обновлением пользовательского интерфейса, вам следует поместить оба задания в dispatch_group, чтобы reloadData ждал их.

Вам действительно нужно копаться в том, что работает и когда. Этот симптом иногда может означать, что вы обновляете свой пользовательский интерфейс в фоновом потоке где-то еще. Это может привести к длительным задержкам в получении правильного обновления (возможно, не имея никакого отношения к этому коду). Ввод операторов printf() и использование инструментов важны для того, чтобы убедиться, что вы знаете, что на самом деле происходит.

Вы можете разбить свою работу на более мелкие части и чередовать их, если темп важнее, чем пропускная способность (что вы предлагаете).

25.07.2014
Новые материалы

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

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

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

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

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

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

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