Table/Collection View PrefetchDataSource

Merhabalar bugün UITableView ve CollectionView ailesinde bulunan protocollerden bahsedeceğim.
- UITableViewDataSourcePrefetching
- UICollectionViewDataSourcePrefetching
PrefetchDataSource iOS 10.0 ile karşımıza çıktı ve iyiki de çıktı.
Öncelikle prefetchDataSource yokken nasıldı onu inceleyelim.
iOS ≤ 9

iOS 10 öncesinde bir UITableView ‘in lifecyle’ı tam da yukarıdaki gibidir.
- tableView(_:cellForRowAt:) -> Ekranda gözükeceği anda cell’imizi customize edip return ettiğimiz method.
- tableView(_:willDisplay:forRowAt:) -> IndexPath row u ekranın en altındaki cell’in 1 altındaki row olarak değer alan methodumuz. Hali hazırda ekranda hiçbir şekilde gözükmez.
- tableView(_:didEndDisplaying:forRowAt:) -> willDisplay methodumuzun tam tersine IndexPath row u ekranın en üstündeki cell’in 1 üstündeki row olarak değer alan methodumuz. Hali hazırda ekranda hiçbir şekilde gözükmez.
Yukarıdaki örnekte default UITableViewCell kullandım ve burada tabiki herhangi bir prefetch’e ihtiyaç duyulmuyor. Ancak aynı mantıkta çoğu zaman collectionView veya tableView içinde resim vb. multimedyaları koyduğumuzda bu controllerde smooth scroll sağlanmıyor. Bu durumlarda async çağrılarla resimlerimizi fetch edip ilgili control üzerine yerleştiriyoruz. İşte tamda bunun bize prefetchRowAt yardımcı oluyor.
iOS ≥ 10

UITableView için prefetchRowAt methodu IndexPath row u ekranın en altındaki cell’in 10 altındaki rowun tamamını değer alan methodumuz. Bu kısımda kullanıcımız scroll ile aşağıya daha inmeden ilgili rowların datalarını fetch edersek cell gözüktükten sonra fetch süresini beklememiş olacak. Aynı şekilde methodumuz yukarıya doğru scroll edilincede 10 üstündeki row’un indexPath’ini parametre olarak alır.
tableView.prefetchDataSource = self
TableView’in prefetchDataSource’unu set ettikten sonra :
prefetchRowsAt methoduyla fetch işlemine başlanır cancelPrefetching ile ise o anki scroll yönünden vazgeçip aksi yönde scroll yapılması durumunda eğer herhangi bir task varsa , o taskı iptal etmek için kullanılan bir methoddur. Örneğin Prefetch’i OperationQueue ile taskları yöneterek yapabilirsiniz.

Görüldüğü gibi ters scroll ile başlanan prefetchler arasında, cancel methoduna düşenler oldu. Table View için bahsettiklerim Collection View içinde geçerlidir.

Bir Sonraki Yazıda Görüşmek Üzere ✋