SORU
7 Mart 2011, PAZARTESİ


Grand Central (GCD) vs performSelector - daha iyi bir açıklama Gönderme ihtiyacı

Hem GCD ve performSelectorOnMainThread kullandım:uygulamalarım waitUntilDone ve değiştirilebilir--, performSelectorOnMainThread:waitUntilDone. N-C GCD için sarıcı C sözdizimi olarak düşünmek eğilimindedir. Eşdeğer olarak: bu iki komut düşünüyordum

dispatch_sync(dispatch_get_main_queue(), ^{ [self doit:YES]; });


[self performSelectorOnMainThread:@selector(doit:) withObject:YES waitUntilDone:YES];

Yanlış mıyım? Yani, orada GCD olanlara karşı, performSelector* komutların bir fark var mı? Onlarla ilgili pek çok döküman okudum, ama henüz kesin bir cevap görmek için.

CEVAP
7 Mart 2011, PAZARTESİ


Jacob işaret ettiği gibi, aynı görünüyor olsa da, bunlar farklı şeylerdir. Aslında, eğer zaten ana konu üzerinde çalıştırıyorsanız ana konuya gönderme eylemleri, ele aldıkları çok önemli bir fark var.

Ana iş parçacığı bu arada bir şey sürmüş, ortak bir yöntem vardı nereye yakın, bazen de koştum. Bazı UI güncellemeleri korumak için, herhangi bir sorun ile onlar için -performSelectorOnMainThread: kullanarak olmuştu.

Ana sıra dispatch_sync kullanılarak açıldığında, uygulama bu yöntem, ana sıraya çalıştırıldığı zaman çıkmaz. Görüyoruz dispatch_sync, belgeleri okuma

Bu işlev, arama ve hedefleme geçerli sıra kilitlenme olur.

-performSelectorOnMainThread: için göremiyoruz

bekle

Olup olmadığını belirten bir Boole sonra kadar geçerli iş parçacığı engeller belirtilen seçici gerçekleştirilir ana iş parçacığı üzerinde alıcı. Belirtin EVET bu konuyu engellemek için; aksi halde, belirtin bu yöntem dönüş YOK hemen.

Geçerli iş parçacığı da ana ise iplik, ve EVET bunun için belirtin parametre, ileti teslim ve hemen işlenmiş.

Ben hala GCD şıklığı tercih, derleme zamanı sağlar daha iyi kontrol ve daha fazla esneklik değişkenleri ile ilgili olarak, vb., bu küçük yardımcı işlevi kilitlenmeleri önlemek için yaptım:

void runOnMainQueueWithoutDeadlocking(void (^block)(void))
{
    if ([NSThread isMainThread])
    {
        block();
    }
    else
    {
        dispatch_sync(dispatch_get_main_queue(), block);
    }
}

Güncelleme:Dave Dribin caveats section ondispatch_get_current_queue() işaret ederek yanıt olarak yukarıdaki kodu [NSThread isMainThread] kullanarak değiştirdim.

Ben o zaman kullanın

runOnMainQueueWithoutDeadlocking(^{
    //Do stuff
});

ana iş parçacığı güvenliğini sağlamak için gereken eylemleri gerçekleştirmek için, orijinal yöntemi idam ne olduğunu önemsemeden.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CHISTOSITOJAJA

    CHISTOSITOJA

    27 HAZİRAN 2010
  • geraldnonadoez

    geraldnonado

    3 Temmuz 2013
  • PlugResearch

    PlugResearch

    22 Mart 2006