Yukarıda açıkladığınız eşzamansız gönderim durumunda, ana iş parçacığında olup olmadığınızı kontrol etmeniz gerekmez. Bavyeralı'nın belirttiği gibi, bu sadece ana iş parçacığında çalıştırılmak üzere sıraya alınacaktır.
Ancak, a'yı kullanarak yukarıdaki işlemleri yapmaya çalışırsanız dispatch_sync()
ve geri aramanız ana iş parçacığındaysa, uygulamanız o noktada kilitlenecektir. Bunu burada cevabımda açıklıyorum , çünkü bu davranış bazı kodları taşırken beni şaşırttı -performSelectorOnMainThread:
. Orada bahsettiğim gibi, bir yardımcı fonksiyon oluşturdum:
void runOnMainQueueWithoutDeadlocking(void (^block)(void))
{
if ([NSThread isMainThread])
{
block();
}
else
{
dispatch_sync(dispatch_get_main_queue(), block);
}
}
bu, bulunduğunuz yöntem şu anda ana iş parçacığı üzerinde değilse, ana iş parçacığı üzerinde eşzamanlı olarak bir blok çalıştıracak ve yalnızca varsa, satır içi satır yürütür. Bunu kullanmak için aşağıdakine benzer bir sözdizimi kullanabilirsiniz:
runOnMainQueueWithoutDeadlocking(^{
//Do stuff
});