2011-12-27 15 views

cevap

14

Neyi başarmaya çalıştığınıza bağlıdır. Bloklarla ilgili harika şeylerden biri, yerel kapsamı yakalamalarıdır. Aynı sonucu bir işlevle elde edebilirsiniz, ancak ilgili değerlerle dolu bir bağlam nesnesini geçmek gibi bir şey yapmak zorunda kalırsınız. Bir blok ile, bunu yapabilirsiniz: Yani basitçe değişken num1 kullanarak, zaman myBlock noktada değeri tanımlandı

int num1 = 42; 
void (^myBlock)(void) = ^{ 
    NSLog(@"num1 is %d", num1); 
}; 

num1 = 0; // Changed after block is created 

// Sometime later, in a different scope 

myBlock();    // num1 is 42 

yakalanır.

Apple'ın documentation itibaren

: Onlar olduğu çağırma noktasında kod yazmak için izin

  1. :

    Blokları iki ana nedenden dolayı geleneksel geri arama fonksiyonları için yararlı bir alternatiftir Daha sonra yöntem uygulaması bağlamında yürütülür. Bloklar, olup, çoğu zaman çerçeve yöntemlerinin parametreleridir. Yerel değişkenlere erişime izin veriyorlar. Bir işlem yapmak için gereken tüm bağlamsal bilgilerini içeren bir veri yapısı gerektiren geri aramalar yerine, doğrudan yerel değişkenleri erişebilirsiniz.

+0

Harika bir açıklama. Yine de neden 1 için bir sorum var. Örneğin tamamlama işleyicisi engelini atın. Çok iş parçacığı içermiyorsa, yani. yöntem ve bloğu her ikisi de ana kuyrukta çalışır, tamamlama kodunu bloğun içine ve bloğun dışına koyma arasında hiçbir fark olmamalıdır. Tamamlama kodu, her iki durumda da yöntem bittiğinden SONRA çalışır. Doğru mu? – Philip007

+0

Evet, bu doğru, ancak bir yöntemin, zaman uyumsuz olarak bir şey yapmak için zamana ihtiyacı olduğu ve ana iş parçacığını engellemeden yaptığı çok sayıda durum var (sadece çoklu iş parçacığı değil, bkz. NSRunLoop).Aynı yöntemin bazen eşzamanlı olarak çalışabileceği ve tamamlanmadan önce tamamlama bloğunu arayabileceği ve diğer zamanların senkronize olmayan şekilde çalıştığı uygulama vardır. Farklı (arama) kodu yazmadan her iki olasılık için de izin vermek güzel. Başka bir şey ise, tamamlama bloklarının çoğu zaman yöntemin birden çok değer döndürmesine izin veren argümanları olmasıdır. –

+0

WWDC 2011'den Session 308 ("Uygulamada Bloklar ve GCD"), sıralama ile ilgili güzel bir örnekle sıradan işlevler üzerindeki blokların (bu cevapta ele alınan şekilde) avantajlarını vurgular. – Aky

4

this answer için:

Blokları onlar izin bir olaya tepki olarak gerçekleşecek, ancak ayrı bir yöntem veya işlev yazmak var ziyade eylemleri tanımlamak izin verir Bu olaya ilişkin dinleyiciyi kurduğunuz yerden taşıma kodunu yazmanız gerekir. Bu, bir kod karmaşasını kaydedebilir ve uygulamanızı çok daha düzenli hale getirebilir. i o görevden ne olacağını uyarı bakış oluşturma sırasında karar eğer seni verebilir hangi

iyi bir örnek uyarı görüşündedir, bunun yerine i temsilci yöntemini yazıp bekleyin iyi olacak çağırmak için. Yani anlamak ve uygulamak çok daha kolay olacak ve aynı zamanda hızlı işlem sağlıyor.

+4

şeyler plagiarize etmeyin diğerleri uygun referans verilmeden başka yerlerde yazdım. Bu sizi bu siteden çok çabuk askıya alacaktır. –

+0

Evet .. bunu gelecekte yapacağız ... bu son zamanlarda kaçırılmış olabilir .. – rishi

İlgili konular