Sobes.tech
Junior — Middle

Za jakých podmínek použití main.sync nedojde k vzájemnému zablokování vláken?

sobes.tech AI

Odpověď od AI

Použití DispatchQueue.main.sync nezpůsobí vzájemné zablokování (deadlock) pouze v případě, že volání není provedeno z hlavního vlákna. Pokud voláte main.sync z hlavního vlákna, toto vlákno bude čekat na dokončení bloku, který nemůže začít, protože hlavní vlákno je již obsazeno — což způsobí deadlock.

Příklad bezpečného použití:

DispatchQueue.global().async {
    DispatchQueue.main.sync {
        // Aktualizace UI
    }
}

Zde je volání main.sync provedeno z pozadí vlákna, takže nedochází k zablokování. Hlavní pravidlo je nikdy nevolat DispatchQueue.main.sync z hlavního vlákna.