`[NSThread isMainThread]` всегда возвращает ДА

Этот код

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
      NSLog(@"Main Thread? %d", [NSThread isMainThread]);
});

показывает, что я в основном потоке. Даже делая это:

queue = dispatch_queue_create("nonMainQueue", NULL);

все еще сообщает, что я в главной очереди. Это, кажется, потому что я использую dispatch sync.

Означает ли это, что мой код такой же, как вообще не используется dispatch_sync? Также: какая точка dispatch_sync, если она вообще ничего не делает, тогда?

Ответ 1

Поскольку очереди - это не потоки, чтобы проверить, находитесь ли вы в главной "очереди", вы должны использовать другой код, что-то похожее на это:

if (dispatch_get_current_queue() == dispatch_get_main_queue()) {
   NSLog(@"On Main Thread!");
}

Просто обратите внимание, что dispatch_get_current_queue устарел и полностью удаляется в более поздней версии iOS/Mac OS.

Ответ 2

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

Ответ 3

Мое понимание от Apple GCD guide, нет гарантии, что очереди отправки будут выполняться в отдельном потоке. GCD определит, какой поток, и при необходимости создаст новый.

Теперь вам не нужно думать о потоках.

Единственное, о чем нужно помнить, - убедиться, что вы обновляете элементы пользовательского интерфейса в главной очереди, например:

// on background queue
dispatch_async( dispatch_get_main_queue(), ^(void){
    someLabel.text = @"My Text";
});