Убедившись, что я правильно объясняю вложенный GCD

Поэтому я помещаю 10 задач в параллельную очередь, используя dispatch_async. Они не блокируют следующую задачу и обрабатываются по порядку. Мой пользовательский интерфейс является отзывчивым.

for (int i = 0; i < 10; i++) {

    dispatch_async(concurrencyQueue, ^() {

        NSLog(@"..calling insertion method to insert record %d", i);

           dispatch_sync(serialQueue, ^() {

            //this is to simulate writing to database
            NSLog(@"----------START %d---------", i);
            [NSThread sleepForTimeInterval:1.0f];
            NSLog(@"--------FINISHED %d--------", i);

        });

    });
}

В рамках каждой задачи мы моделируем запись в базу данных с "1-секундным сном" в последовательной очереди через dispatch_sync.

Я всегда думал, что dispatch_sync блокирует всех и синхронизирует свои задачи, потому что это то, как он себя ведет, когда я использую его индивидуально. Однако в этой ситуации он не блокирует основной поток. Вместо этого он работает красиво в фоновом режиме, как я хочу.

Это потому, что какой-либо поток связан с очередью?

Например, основной поток выполняет параллельную очередь через dispatch_async и поэтому не блокируется.

Функция dispatch_sync только синхронизирует и блокирует фоновый поток, который работает в параллельной очереди. Следовательно, dispatch_sync связан с фоновым потоком, поэтому никогда не затрагивает основной поток пользовательского интерфейса.

Правильно ли я думаю?

Благодарю вас!

+1
источник поделиться
2 ответа

Вы никогда не блокируете основной поток, потому что ваш код работает либо с потоками concurrencyQueue, либо с потоком serialQueue. Ни один из них не является основным потоком.

Все вызовы sleep происходят один за другим в потоке serialQueue. Таким образом, заблокирован поток serialQueue.

Однако, поскольку вы отправляете serialQueue с помощью dispatch_sync, вы также блокируете каждый поток параллельной очереди. Это было бы лучше нарисовано, если вы добавите еще один NSLog после вызова dispatch_sync.

for (int i = 0; i < 10; i++) {
    dispatch_async(concurrencyQueue, ^() {
        NSLog(@"..calling insertion method to insert record %d", i);

        dispatch_sync(serialQueue, ^() {
            //this is to simulate writing to database
            NSLog(@"----------START %d---------", i);
            [NSThread sleepForTimeInterval:1.0f];
            NSLog(@"--------FINISHED %d--------", i);
        });

        NSLog(@"..called insertion method to insert record %d", i);
    });
}

2-й NSLog после dispatch_sync покажет вам, как dispatch_sync влияет на вызовы на dispatch_async.

+3
источник

Да, вы правы. dispatch_sync() блокирует только поток, в котором выполняется очередь.

+2
источник

Связанные вопросы


Похожие вопросы

Посмотрите другие вопросы по меткам или Задайте вопрос