Nesneler Arası Veri Taşımada Alternatif Yöntemler

Başlığı nasıl vermek gerektiğinde kararsız kaldım, tam olarak anlatacağımız konuyu ifade edemeyebilir 🙂

Uygulama içerisinde yazdığınız sınıfların birbirlerine veri göndermeleri gerekecektir. Bir ekrandan başka bir ekranı açarken, açacağını yeni ekrana bir veri taşımaktan bahsetmiyorum. Özellikle asenkron işlemler yapan sınıfların veriyi aktarma ihtiyacı vurgulamak istediğim.

Örneğin bir ImageLoader isminde bir sınıfınız ve içerisisinde loadImage isminde bir methodunuz var. Bir resmin URL’ini vererek size UIImage olarak dönmesini istiyorsunuz. Öncelikle konumuzla ilgisi yok ama buna benzer işlemleri main thread dışında bir thread üzerinden yapmanız gerektiğini bir not olarak düşmek isterim. Şayet bu konuda bir problem var ise Dispatcher konusundaki yazıyı okumanızı öneririm.

Yukarıda bahsettiğimiz nesne, şayet cihaz üzerinde bulunan bir resmi getirecek olsaydı, aşağıdaki şekilde yazabilirdiniz.

class ServiceManager {
    func loadImage(filePath : String)->UIImage? {
        let image = UIImage(contentsOfFile: filePath)
        return image
    }
}

Dikkat ederseniz yukarıdaki sınıf UIImage? şeklinde optional bir değer dönmekte. Optional kavramıyla ilgili bir sorun var ise ilgili yazıyı okumanızı öneririm. 

Yukarıdaki methodumuz oluşturduğu UIImage nesnesini return etmekte. Cihaz üzerindeki bir dosyayı çekeceği için bu şekilde kullanmakta sorun yok. Fakat bu resmi bir web url’den çekecekseniz bu şekilde kullanmanız mümkün olmayacaktır. Çünkü öncelikli olarak resmi asenkron olarak çekmeniz gerekmektedir. Belirsiz bir zamanda yüklemesi tamamlanmış olarak resmi de return etmeniz mümkün olmayacaktır. Çünkü method sizi o zamana kadar beklemeyip zaten method sonlanmış olacaktır. İşte bu durumda loadImage methodunu çağıran sınıfa resmi bir şekilde ulaştırmak gerekmektedir. Buna benzer onlarca örnek sıralanabilir.  Bu durumda incelenmesi gereken 3 yöntem mevcuttur.

  1. Protocol
  2. Closure
  3. NotificationCenter

Bu yöntemlerin detaylarını konuşacağız. Fakat bilmeniz gereken bu 3 yöntemin farklı kullanım alanlarının olduğudur. Ben birbirlerine alternatif olarak görmemekteyim. Hepsinin kullanım mantığını anlayıp, hangi durumlarda hangi yöntemi tercih etmeniz gerektiğini öncelikle vurgulamak istiyorum.

Bu sebeple öncelikli olarak protocol, closure, notificationcenter yazılarını okumanız ve kalan bölüme sonrasında devam etmenizi öneririm. Bir yazı çok uzun olduğu zaman benimde pek okuyasım gelmiyor. Bu şeklide farklı yazılara bölmemin sebebi budur:)

…….

İlgili yazıları okuduktan sonra devam ettiğinizi umuyorum. 🙂

Şimdi hangi yöntemin ne işe yaradığını konuştuğumuza göre, ne durumda hangisini kullanabileceğimiz üzerine değerlendirme yapalım.

  • Nesne içerisindeki bir  methodu çağırdığınız zaman asenkron olarak yukarıda anlatıldığı şekliyle size bir veri dönmesi gerekiyorsa. Yani 1-1 bir etkileşim var ise. Bu durumda closure veya protocol tercih etmelisiniz.
    • Şayet method tek bir durum için birşeyler dönüyorsa. Yukarıdaki örnek üzerinden örneğin sadece veriAlindi durumu için bir iletişim kanalına ihtiyacınız var ise, closure kullanabilirsiniz.
    • Fakat 2-3’den fazla durum için bir etkileşim söz konusu ise bu durumda protocol kullanınız.
  • Şayet bir nesnenin, birden fazla nesneye bir veri göndermesi gerekiyorsa. Veya hiyerarşik olarak birbiri ardına yapılan işlemler değilse. Ne demektir bu. Örneğin bir ekran açtınız, sonra 3-5 ekrana daha yönlendiniz. Ve son ekrandan, ilk ekrana bir veri post etmeniz gerekiyorsa. Bu gibi durumlarda NotificationCenter kullanmalısınız.
Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn
Bu yazıyı beğendiyseniz daha fazla kişiye ulaşmasını sağlamak için paylaşabilirsiniz.

Leave a reply