Block nedir, nasıl kullanılır? 🔄
Merhaba,
bu hafta sizlere mükemmel bir konudan bahsedeceğim “BLOCK”.
Block, istenilen herhangi bir anda yürütülebilecek olan kod parçasıdır. Değişken olarak tanımlanabilir, metodlara parametre olarak verilebilir, typedef olarak tanımlanabilir, property olarak kullanılabilir. Bir düşünün ki metodu (görev yerine getiren bir kod parçasını) bunca özelliği ile kullanabiliyorsunuz, bu harika bir şey. Aynı zamanda da NSArray NSDictionary gibi collection’lara eleman olarak eklenebilmektedir, çünkü en nihayetinde bir nesnedir. Bir block tanımlayacaksanız eğer caret (^) işaretini kullanmak zorundasınız.
En güzel özellikleri ;
- Istenilen herhangi bir anda yürütülebilir olması
- Classtan class’a veri aktarımında çok zevkli bir kullanım sağlaması
- Delegate’e göre daha az kod ile yazıldığı için daha temiz kod düzeni sağlaması
(bunlar tabii bana göre en güzel özellikleri 😛)
Hangi şekillerde kullanılabilirler?
- Değişken
- Property
- Method parametresi
- Typedef
Haydaaa her şey oluyor bu da 💛
Senaryo;
X ve Y View Controller’ları var. Y View Controller’ında bastığım button random bir sayı yaratsın ve o sayıyı X View Controller’ında bulunan label’a yazsın. Bu senaryo bir yerlerden tanıdık geldi mi? Yaratılan View Controller (push sırasında) kendini yaratan Controller’a veri göndermek ve orada bir işlem tetiklemek istiyor. Delegate ile bu sorunu önceki yazımızda çözmüştük. Şimdi ise aynı problemi block kullanarak çözelim. Aynı zamanda da blockların yukarıdaki özelliklerinin nasıl kullanılmış olduğunu görelim.
X View Controller’dayım. Next butonuna bastığımda Y’ye geçmek istiyorum. Y’yi ben yarattığıma göre onun init metoduna parametre gönderip, y’de parametreyi kullanabilirdim. Bunu biliyorum.
Aynı zamanda block’ların metodlara parametre olarak kullanıldığını da biliyorum. Bu kod bize şunu söylemektedir;
- Y View Controller’ini storyboarddaki id’yi kullanarak yarat
- Navigation Controller sayesinde y View Controller’ina geç (push)
- y View Controller’ının initWithNumberBlock isminde bir metodu var ona parametre olarak NSNumber tipinde number isminde parametre alabilecek bir block gönder.
Artık söz Y View Controller’daki initWithNumber methodunda.
O da diyor ki ben bir init methoduna sahibim ve parametre olarak numberBlock isminde NSNumber tipinde parametre alan ve donus degeri olmayan bir block bekliyorum. Icerisindeki islemleri gormek icin m dosyasına gecelim.
Parametre olarak numberBlock Y View Controller’a ulaşmış oldu. Bu init metodu içerisinde bu islemi yapabilirim. init metodu Y View Controller’ının viewDidLoad metodu çalışmadan önce çalışmaktadır. Yukarıdaki kod hatasız çalışır. Y View Controller’ında hiç bir butona basma şartım bulunmadan sayfalar arasında ileri geri gelerek sayıyı yaratmış olabilirim.
Ancak bu noktada su istenmiş olsaydı, Y View Controller’daki butona basıldığında X View Controller’ında sayı yaratılsın. O zaman init metodunda degil de butonun action metodunda block çağırımını gerçekleştirmemiz gerekirdi. init ile gelmiş olan bir parametreyi elimizde nasıl tutarız? Eğer bir nesne olsaydı property olarak tutabilirdik, e block da bir nesne değil mi zaten? 💃 Hem de property seklinde nasıl tanımlanacağını da biliyoruz. O zaman numberBlock parametresini karsılayacak tipte bir property yaratalım.
Simdi ise iki üstte bulunan kodu güncelleyelim. Init icerisinde block’u direkt cagirmak yerine Action metodunda calistirmak uzere propertyde bekletelim.
Tamam simdi de butonumuzun action metodu icerisinde numberBlock’u calistiralim.
Property olarak beklettigim numberBlock NSNumber tipinde bekledigi parametreyi aldi ve calistirildi. Simdi bu block neredeyse parametresi ile birlikte gidip orada calisacak. Neredeydi? XViewController’da.
number degerine parametre gelir, block calisir ve label’in texti guncellenir. 🙉
Peki block’u typedef olarak nasıl kullanırım?
Peki ben bunların syntax’ını tek tek yazacak mıyım? Hayır çünkü bookmark’ınıza ekleyebileceğiniz tatlış bir bağlantı var buyrunuz. Benim kullandıkça elim syntaxa alıştı ama alışana dek burayı kullanabilirsiniz.
Typedef kullanımıyla ise kod daha okunur hale geliyor, ve tek bir yerden degiştirilebiliyor. Güncelleştirelim;
Programımızı çalıştıralım 😍
Okuduğunuz için teşekkürler 🙌