Untuk kasus pengiriman asinkron yang Anda jelaskan di atas, Anda tidak perlu memeriksa apakah Anda berada di utas utama. Seperti yang ditunjukkan oleh Bavarious, ini hanya akan di-antri untuk dijalankan di utas utama.
Namun, jika Anda mencoba melakukan hal di atas menggunakan a dispatch_sync()
dan panggilan balik Anda ada di utas utama, aplikasi Anda akan menemui jalan buntu pada saat itu. Saya menjelaskan ini dalam jawaban saya di sini , karena perilaku ini mengejutkan saya ketika bergerak beberapa kode dari -performSelectorOnMainThread:
. Seperti yang saya sebutkan di sana, saya membuat fungsi pembantu:
void runOnMainQueueWithoutDeadlocking(void (^block)(void))
{
if ([NSThread isMainThread])
{
block();
}
else
{
dispatch_sync(dispatch_get_main_queue(), block);
}
}
yang akan menjalankan blok secara bersamaan pada utas utama jika metode yang Anda gunakan saat ini tidak pada utas utama, dan hanya menjalankan blok inline jika itu. Anda dapat menggunakan sintaks seperti berikut untuk menggunakan ini:
runOnMainQueueWithoutDeadlocking(^{
//Do stuff
});