Попытка запуска двух процессов одновременно в GCD - iOS -- ios поле с участием multithreading поле с участием grand-central-dispatch пол Связанный проблема

Attempting to run two processes simultaneously in GCD - iOS


1
vote

проблема

русский

Я пытаюсь загрузить два набора данных на заднем плане одновременно через 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];      }); });   
Английский оригинал

I'm attempting to load two sets of data in the background simultaneously through GCD in iOS. Currently, I built two distinct concurrent queues, in which I run each of the tasks. However, the delay between the completion of the first queue and the second queue (which run identically intensive tasks) is very large (so I assume that they are not running concurrently). Do you guys have any suggestions about how to fix this? I don't completely understand the correct way to approach this. Thanks!

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];      }); }); 
</div
        
 
 

Список ответов

4
 
vote
vote
Лучший ответ
 

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

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

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

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

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

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

 

They are very likely running concurrently. They may not be running in parallel. It's important to know the difference. GCD provides concurrency, it makes few promises about parallelism. This is true of many libraries (and is usually the more important feature).

How many cores do you have? If you only have a single core, then it is not surprising if the second job waits for the first to complete. If you have two cores, but the main queue has a lot of work on it, then it's likely to get prioritized before one of your blocks. You should use the GCD tools in Instruments to explore when things are getting scheduled (printf is also a powerful tool here). Remember, context switching costs time. To get the best throughput on a core, you want to run one thing on it until that thing is complete, then run the next thing. Switching back and forth to get them to complete together will make both of them run more slowly. Most systems bias towards throughput. There's no reason to swap out a block in order to run a block of the same priority.

Do you know that both jobs get their data at the same time? If you're pulling from the network, it is very possible that one is coming much sooner or faster than the other. You may be pipelining on a single connection, which could serialize your network traffic. You should log when the data gets to you. You should also log when your block actually starts (put a printf() at the top of the block).

If you need the first job to wait for the second to complete before updating the UI, then you should put both jobs into a dispatch_group so that the reloadData waits for them.

You really need to dig into what is running and when. This kind of symptom can sometimes mean that you're updating your UI on a background thread somewhere else. That can lead to long delays in getting a correct update (possibly having nothing to do with this code). Putting in printf() statements and using Instruments are important to make sure you know what's actually going on.

You may want to break your job up into smaller pieces and interleave them if pacing is more important than throughput (which you're suggesting it is).

</div
 
 

Связанный проблема

0  Лучшие практики для запроса / ответа на сетевой вызов в приложении iPhone Программирование [Закрыто]  ( Best practises for network call request response in iphone application programmi ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> <Путь d = "M15 6.38A6.48 6.48 0 007.78. 04H-.02A6.49 6.49 0 002.05 ...

0  Фоновый режим (Fetch) в iOS 8  ( Background mode fetch in ios 8 ) 
Я работаю над приложением iOS, которое использует фоновый режим для публикации обновления на сервере. Приложение Wack, проверяет состояние батареи, выключает ...

0  Как использовать игрока YouTube IOS Perger с помощью use_frameworks! с какоаподами [закрыты]  ( How to use youtube ios player helper with use frameworks with cocoapods ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыто. Этот вопрос не воспроизводится или был вызван опечаткам...

0  PDF не загружается из папки документов на приложении Relauch iOS  ( Pdf not loading from documents folder on app relaunch ios ) 
У меня есть PDF, который я загружаю с сервера и сохранил его. Затем я открываю файл из пути файла в <код> UIWebView . Это работает в первый раз, когда я запус...

1  Есть ли способ редактировать мой текущий игровой центр лидеров после моего приложения iOS?  ( Is there a way to edit my current game center leaderboard once my ios app is liv ) 
Итак, я видел, что я сделал ошибку, когда я настроил мою лидеров в моей игре. Я установил его как «низкий до высокого» вместо «высокого к низкому», и это выгл...

0  Uilocalnotification фоновое событие огня для паузы музыки в iOS  ( Uilocalnotification background event fire to pause music in ios ) 
Мне нужно приостановить играть музыку, когда острельный огонь на Uilocalnotification. Кто-то предложит мне сделать со следующими кодами. Вы можете увидеть...

1  Как извлечь время истечения срока действия сертификатов IOS программно  ( How to fetch expiry date of ios certificates programmatically ) 
Я хочу получить срок годности сертификата, с которой подписан мой IPA. Мне нужен эта дата истечения срока действия, которая будет отображаться в приложении. Я...

0  Как трепетать файлы записи в iOS iPhone "Найти на моем телефоне" Папка  ( How to flutter write files to ios iphone find on my phone folder ) 
Моя цель - позволить моему приложению писать и читать файлы, созданные моим приложением. Например, напишите, а затем разрешите пользователю электронной почты ...

288  Навигационная панель навигации iPhone Цвет текста  ( Iphone navigation bar title text color ) 
Кажется, что цвет навигации iOS навигация навигация по умолчанию белый. Есть ли способ изменить его на другой цвет? Я в курсе navigationItem.titleView под...

0  Не может запустить TCP-сервер на iOS, сотовой  ( Cannot run tcp server on ios cellular ) 
Я пытаюсь запустить TCP-сервер на iOS из сотовой связи. В целях задачи этого вопроса я написал эту очень упрощенную версию сервера и клиента в C, используя So...

376  Как я могу преобразовать Swift Array в строку?  ( How do i convert a swift array to a string ) 
Я знаю, как программно сделать это, но я уверен, что есть встроенный ... Каждый язык, который в котором у меня использовал, имеет какое-то текстовое предста...

2  Как установить выбранную первую ячейку по умолчанию в Saslidemenu?  ( How to set selected first cell by default in saslidemenu ) 
Я использую этот сценарий для скольжения меню " Saslidemenu ", и я Пытаюсь выбрать первый элемент по умолчанию, но без успеха. Кто-нибудь знает, как это сдела...

0  Как показать знак на библиотеке Tapku для данных JSON, которые содержат дату начала и дату окончания?  ( How to show mark on tapku library for json data which contain start date and end ) 
Я погрузился о том, как отметить дату в Tapku Library. По их словам, у меня есть код ниже для JSON, я получаю, но он показывает маркировку либо целую календую...

0  Не удалось отправить сообщение с помощью RTCDatachannel на iOS  ( Failed to send message using rtcdatachannel on ios ) 
Мне удалось разделить видео и аудио между A и B, и я нахожу RTCDatachannelState изменился на KRTCDatachannelStateOpen. <код> - (void)channelDidChangeState:(...

1  Как бы я выровнял изображение в нижнем правом направлении вида, используя классы размера в XCode?  ( How would i align an image to the bottom right of the view using size classes in ) 
У меня есть изображение, которое я хочу выровнять с правым нижним углом вида, а затем я хочу, чтобы остальное изображение масштабируется, чтобы заполнить дост...

Связанный проблема

0  Лучшие практики для запроса / ответа на сетевой вызов в приложении iPhone Программирование [Закрыто] 
0  Фоновый режим (Fetch) в iOS 8 
0  Как использовать игрока YouTube IOS Perger с помощью use_frameworks! с какоаподами [закрыты] 
0  PDF не загружается из папки документов на приложении Relauch iOS 
1  Есть ли способ редактировать мой текущий игровой центр лидеров после моего приложения iOS? 
0  Uilocalnotification фоновое событие огня для паузы музыки в iOS 
1  Как извлечь время истечения срока действия сертификатов IOS программно 
0  Как трепетать файлы записи в iOS iPhone "Найти на моем телефоне" Папка 
288  Навигационная панель навигации iPhone Цвет текста 
0  Не может запустить TCP-сервер на iOS, сотовой 
376  Как я могу преобразовать Swift Array в строку? 
2  Как установить выбранную первую ячейку по умолчанию в Saslidemenu? 
0  Как показать знак на библиотеке Tapku для данных JSON, которые содержат дату начала и дату окончания? 
0  Не удалось отправить сообщение с помощью RTCDatachannel на iOS 
1  Как бы я выровнял изображение в нижнем правом направлении вида, используя классы размера в XCode?