Блоки 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

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