`[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";
});