Блоки iOS вызываются в какой поток?
Я изучаю блоки из видео в Стэнфорде. Сейчас я участвую в роли, которая объясняет основные данные. Учителя упоминают что-то о:
- (void)openWithCompletionHandler:(void (^)(BOOL success))completionHandler;
Он сказал, что блок завершения обработки будет вызван в потоке, который вызвал метод. Таким образом, в основном метод запускает async, но блоки вызываются в потоке, допускают основной.
Итак, мой вопрос заключается в том, чтобы все блоки запускались в потоке, откуда был сделан вызов метода. Чтобы проиллюстрировать, почему я задаю этот вопрос, у меня есть класс Async, который запрашивает сервер.
Формат всех этих методов выглядит следующим образом:
- (void) getSomething:(id <delegateWhatever> const)delegate{
goto background thread using GCD..
Got result from server...
Go back to main thread and call the delegate method...
}
Когда я использую блоки, мне не нужно беспокоиться о возврате в основной поток, если они будут вызваны там, где был сделан вызов?
Надеюсь, что это ясно,
Заранее спасибо
Ответы
Ответ 1
Если что-то выполняется асинхронно, вы должны прочитать документацию, чтобы узнать, в каком потоке, например. будет выполнен блок завершения. Если это ваш код, вы здесь, вы можете использовать глобальные очереди GCD, вы можете создать свою собственную очередь и выполнить ее там или что угодно...
В общем, блоки ведут себя как функция или вызов метода, он выполняется в потоке, который вызывает его. Возможно даже, что один и тот же блок будет выполняться из двух разных потоков одновременно.
И просто чтобы быть ясным: Даже если вы используете блоки, вам нужно заботиться о возврате в основной поток, конечно, если это необходимо
Ответ 2
Ничто не заставляет блоки вызываться в определенном потоке, поэтому зависит от конкретного метода, нужно ли вам беспокоиться о том, что его обратный вызов находится в основном потоке. (На практике я не помню, чтобы когда-либо видел библиотеку, где метод, вызываемый в основном потоке, не вызывал бы его обработчик завершения также в основном потоке. Но вам все равно нужно прочитать документацию конкретной библиотеки и метод, который вы используют, как всегда.)