Diffable Data Source Nedir? 🧐

Evren Yaşar
NSAnkara
Published in
4 min readMar 3, 2020
photo by Mounzer Awad

Apple WWDC 2019 da geliştiriciler için bir sürü yeni özellik ve framework tanıttı. Bunlardan en dikkat çekeni SwiftUI’dı. Diğer tanıtılan özellikler SwiftUI’nın gölgesinde kayboldu. Kaybolan güzel özelliklerden biride UITableView ve UICollectionView için oluşturulan Diffable Data Source sınıfıydı.

UITableViewDiffableDataSource ve UICollectionViewDiffableDataSource benzer şekilde kullanılıyor, bu yazımızda anlaşılması daha kolay olduğu için UITableViewDiffableDataSource üzerinden ilerleyeceğiz.

Yazının devamında;

  • Diffable data source nedir
  • Diffable data sourceun avantajları
  • Diffable data source kurulumu
  • Snapshot nedir

Şeklinde ilerleyeceğiz.

Diffable Data Source Nedir?

Diffable data sourceu daha iyi anlamak için önce geleneksel yapıyı inceleyelim.

Uygulamanızda sunucudan veri çektiğinizi farzedin. Daha sonra gelen veriden 1 tane itemı silmek istediniz. Silme işlemini yaparken elinizdeki diziden itemı bulup sildiniz. Sıra table viewi güncellemeye geldi. Karşımıza iki tane opsiyon çıkar;

  • reloadData()
  • performBatchUpdates(_:completion:)

Yukarıdaki birinci seçeceği seçerseniz table view tamamı yeniden güncellenir. Kullanıcıya hangi itemın listeden kaldırıldığını animasyonlu bir şekilde gösteremeziniz ve tüm table viewi yeniden oluşturursunuz. Eğer ikinci seçeneği tercih ederseniz güzel bir animasyon ekleyebilirsiniz. Bu kezde uygulamada açık çıkma ihtimali yüksek olur. Kullanıcı deneyiminin ön planda tutmak için performBatchUpdates metodu daha iyidir ancak açık ihtimali geliştiriciyi tedirgin eder.

Problemleri hatırladıktan sonra neden diffable data sourceun geliştirildiği daha kolay anlaşılacaktır.

Diffable data source iki veri arasındaki farklı otomatik hesaplayıp table view ve collection viewin öğelerini güncellemenin kolay yoludur. Table viewin öğelerini güncellerken ekstra bir koda ihtiyaç duymadan animasyon ekler. Geleneksel yöntemde kullanılan UITableViewDataSource yerine geçmektedir.

Şekil 1

Yukarıdaki şekilde basit bir table view örneği mevcut. Table view üzerinde herhangi bir bir sıralama işlemi yapıldığınızı farzedin. Normalde hem celli hemde verinin konumu değiştirmeniz gerekmektedir. Diffable Data Source sayesinde arayüz(UI) ile uğraşmanıza gerek kalmaz, sadece veri sıralamasını değiştirip bir snapshot oluşturmanız gerekir. Oluşturlan yeni snapshotı table viewe uyguladığınızda tüm liste animasyonlu bir şekilde yeniden sıralanır.

Diffable Data Source Avantajları

Apple’ın bu API’yi oluşturmasındaki temel nedenler;

  • Declarative programlamaya geçiş
  • Cell güncemelerinde oluşan açıklardan kaçınmak
  • Karmaşık Section yapılarını uygulamayı kolaylaştırır
  • Cell güncellemeleri kaynaklı crashleri önlemek
  • Cell güncellemlerinde kolaylıkla animasyon eklemek
  • Geliştiricinin arayüzü güncelemekle uğraşması yerine sadece veriye odaklanması

Geleneksel yöntemde table viewe dataları bildirirken UITableViewDataSource protokolünü uygulanıyordu. Bu protokol ile beraber aşağıdaki iki methodu zorunlu olarak implement etmemiz gerekiyordu.

Yukarıda ki iki methodu uygulamanızı gerek kalmaz. Toplam cell sayısı otomatik hesaplanır.

Diffable Data Source Kurulumu

Diffable data sourceda indexPath yerine indentifier item ve sectionlar kullanmanız gerekmektedir. Üzerinde işlem yaptığımız itemı APİ’nin kolaylıkla ayırt edebilmesi gerekir. Itemlar için oluşturduğunuz nesnelerde identifier unique olmak zorundadır. Bunuda sağlamak için Hashable protokolünden faydalanılır. Section yapısını ise enum araçılığı ile çözülebilir. Enumlarda Hashable protokolü otomatik olarak uygulanmaktadır.

iPhone ve iPadleri listelendiği basit bir uygulama hayal edin. Bu senaryoda Product modeline ve ürün yelpazesindeki iki ayrıma ihtiyaç duyacaksınız. Aşağıdaki modeli inceleyebiliriniz.

Yukarıda oluşturulan Section enumu ile verilerin 2 ye ayrıldığını belirtildi. Eğer herhangi bir Section a ihtiyaç durmazsanız main adında bir case uygulayabilirsiniz. Product nesnesine Hashable protokolünü uygulandı. Unique olması için id adında özellik ekledik. Burada manuel değer girmeyle uğraşmamak için UUID nesnesini uygulandı.

Diffable data source sınıfı generic yapıdadır. Örneğini oluştururken itemın tipini ve sectionı belirtmemiz gerekir. Parametre olarak table view/collection view ve closure a ihtiyaç duyar. Closure aracılığı ile oluşturulan cell i döndürülür.

Şimdi sırada Diffable data source örneği oluşturmaya geldi.

Generic UITableViewDiffableDataSource sınıfına Section ve Product tiplerini kullanacağını belirterek parametre olarak daha önceden oluşturulan table viewi(myTableView) atanır. Closure içinde cell örneği oluşturulur. Closure içindeki 3. Parametre bize aktif itemı döndürür. Geleneksel yöntemde data[indexPath.row] şeklinde veriye ulaşılır. Bu yaklaşıma gerek kalmadan direk aktif itema ulaşarak ihtiyacımız olaran veriyi(product.name) kullanabilirsiniz.

SnapShot Nedir?

Diffable data source sınıfında görüntülenmesi istenen veri snapshot haline getirili ve apply metodu araçılığı ile bildirilir.

Yukarıdaki kod blogunda NSDiffableDataSourceSnapshot sınıfının bir örneğini oluşturuldu. Oluşturulan bu örneğe öncelikle kullanılacak Sectionlar eklenmelidir. Section ile ilişkili veri listesinide snapshota eklenir. Son işlem olarak oluşturulan snapShot ı apply metodu ile datasource a uygulanır. Eğer yapacağınız bu işlem hareketli olsun isterseniz animatingDifferences parametresini true yapabilirsiniz.

Eğer Şekil 1 de ki görselde tekrar bakarsanız Snap Shot mantığını daha kolay kavrayabilirsiniz. DiffableDataSource aktif snap shot ile yeni geleni karşılaştırıp cellerin konumlarını ona göre kendiliğinden ayarlar.

Yukarıdaki örnekte herhangi bir itemı silme işlemini gerçekleştirildi. Silmek istediğimiz modeli elde ettikten sonra, data sourceun snapshotı oluşturuldu. Oluşturulan snapshot üzerinden modeli deleteItems metodu yardımıyla silindi. Daha sonra oluşturulan snapshotı data sourcea uygulandı.

Burada dikkat etmeniz gereken şey, veri kümesi üzerin işlem yapmadan direk data source ile ilgilenildi. Ileride oluşabilecek herhangi bir hataya karşın son satırda viewModel üzerindeki asıl veri kümesindede model silindi.

Direk viewModelden silme işlemini yapıp daha sonra oluşan yeni veriyide snapshot aracılığı ile uygulanabilirdi. Bu aslında geleneksel yöntemdeki reloadData() metoduna benzer bir çözüm.

Özet olarak, geliştiricinin cellleri güncellemek ile uğraşması yerine sadece dataya yoğunlaşmasını sağlayan bir yaklaşımdır.

--

--