Форум программистов, компьютерный форум CyberForum.ru

Программирование iOS/iPhone

Войти
Регистрация
Восстановить пароль
 
someMan
0 / 0 / 0
Регистрация: 08.09.2013
Сообщений: 27
#1

dispatch_barrier_async & dispatch_barrier_sync - Программирование iOS/iPhone

18.11.2013, 21:48. Просмотров 1094. Ответов 5
Метки нет (Все метки)

Привет всем обитателям форума!

Вогнал себя в небольшой ступор. Расскажите, пожалуйста, кто в теме:

Если мы пишем код вида:
Objective-C
1
2
3
4
5
6
7
dispatch_async(queue, exmpl_block1);
dispatch_async(queue, exmpl_block1);
 
dispatch_barrier_async(queue, another_block);
 
dispatch_async(queue, exmpl_block2);
dispatch_async(queue, exmpl_block2);

..то, another_block не выполнится до тех пор, пока не закончатся обе задачи exmpl_block1.
А exmpl_block2 не начнутся, пока не закончится another_block.
Правильно ли я понимаю?

Если да, то зачем тогда используется dispatch_barrier_sync? Если мы все равно ожидаем окончания выполнения блока в dispatch_barrier?

Добавлено через 4 минуты
Мелькнула страшная мысль (сейчас Мака под рукой нет, не могу попробовать) - неужели при dispatch_barrier_async мы ожидаем только конца выполнения предыдущих задач?
И мой exmpl_block2 тут же попадет в очередь после запуска another_block?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2013, 21:48     dispatch_barrier_async & dispatch_barrier_sync
Посмотрите здесь:

GCC & iPhone SDK
Objective-C -viewDidLoad & iOS4
Objective-C UITableViewCellStyleSubtitle & UITableViewCellStyleValue1
Lex&Yacc + iOS
Общая библиотека для IPhone & IPad
Cocos2d & XCode Interface Builder
UITableView & UIButton
UISearchBar & UITableView
База данных для iOS & Android
CollectionView & Segue Swift
MacBook Pro 2010 & Future

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
19.11.2013, 08:43     dispatch_barrier_async & dispatch_barrier_sync #2
When the barrier block reaches the front of a private concurrent queue, it is not executed immediately. Instead, the queue waits until its currently executing blocks finish executing. At that point, the barrier block executes by itself. Any blocks submitted after the barrier block are not executed until the barrier block completes.

The queue you specify should be a concurrent queue that you create yourself using the dispatch_queue_create function. If the queue you pass to this function is a serial queue or one of the global concurrent queues, this function behaves like the dispatch_async function.
То есть, зависит от того, какая у вас очередь: если serial или одна из глобальных concurrent, то он ведет себя так же как dispatch_async. Если concurrent - то когда, очередь доходит до блока, он не выполняется сразу же, а ждет пока выполнятся все блоки, которые сейчас выполняются в очереди. Все, что диспатчится после него, ждет пока он не выполнится.

Добавлено через 5 минут
пардон, плохо прочитал вопрос, все же просто:
Unlike dispatch_barrier_async, this function does not return until the barrier block has finished. Calling this function and targeting the current queue results in deadlock.
someMan
0 / 0 / 0
Регистрация: 08.09.2013
Сообщений: 27
21.11.2013, 14:20  [ТС]     dispatch_barrier_async & dispatch_barrier_sync #3
Спасибо.
То есть выходит, что dispatch_barrier_async по аналогии с dispatch_async сразу возвращает управление?
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
22.11.2013, 06:29     dispatch_barrier_async & dispatch_barrier_sync #4
именно
someMan
0 / 0 / 0
Регистрация: 08.09.2013
Сообщений: 27
22.11.2013, 14:42  [ТС]     dispatch_barrier_async & dispatch_barrier_sync #5
Спасибо!
Т.е. получается такая картина:

dispatch_async - никого не ждет и сразу возвращает управление
dispatch_sync - никого не ждет, но не возвращает управление, пока не завершится
dispatch_barrier_async - ждет завершения предыдущих потоков в очереди, и сразу возвращает управление
dispatch_barrier_sync - ждет завершения предыдущих и не возвращает управление, пока не завершится

Я правильно понимаю эту GCD-кухню?
Dan_banan_
10 / 10 / 1
Регистрация: 03.03.2013
Сообщений: 87
Записей в блоге: 1
05.12.2013, 14:42     dispatch_barrier_async & dispatch_barrier_sync #6
dispatch_sync - при вызове на главное очереди приложение повиснет
Yandex
Объявления
05.12.2013, 14:42     dispatch_barrier_async & dispatch_barrier_sync
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru