+2

UICollectionView Prefetching Trong iOS 10

Tại WWDC 2016 Apple đã giới thiệu một tính năng mới cho class UICollectionView trên IOS 10. Giúp cải thiện trải nghiệm người dùng .Trong bài viết này mình muốn đi sâu hơn vào việc cải tiến hiệu năng và những thay đổi trong UICollectionView. Và cụ thể hơn là sử dụng nó như thế nào trong IOS 10.

Trong bài phát biểu tại hội nghị , Các kỹ sư của Apple đã giải thích nguyên nhân nào đã dẫn tới việc hiệu năng kém mượt mà trong CollecionView. Để ứng dụng của bạn được mượt mà hơn, việc tạo động scroll phải được thực hiện ở mức tối thiểu là 60 khung hình mỗi giây. Điều này có nghĩa là 1 khung giao diện người dùng được đưa ra phải được hiển thị không quá 16.67ms để ứng dụng được mượt mà hơn.Nếu tỷ lệ bị giảm xuống , dẫn tới việc app bị giật . Và để giúp cho lập trình viêc tạo ra một trải nghiệm nghiệm tuyệt vời cho người dùng , Apple đã cho ra 1 số thay đổi trong class UICollectionView để có thể cải thiện hiệu năng trong IOS 10.

Nào , hãy cùng mình xem họ đã đổi mới những gì!

Vòng đời của UICollectionView.

Vòng đời của UIcollection View bao gồm 1 loạt các phương thức delegate được gọi theo thứ tự cụ thể cũng như CollectionViewCell đã được rạo ra .Điều này không thay đổi trong IOS 10 , nhưng phương thức willDisplayCell bây giờ được gọi bởi class UICollectionview ngay trước khi cell sẽ được hiển thị trong view. Việc thay đổi nhỏ này giúo tránh những trở ngại về hiệu năng cũng như Collectionview sẽ không vẽ ra 1 cell trước khi nó thực sự cần thiết. Hơn nữa , class CollectionView đã được thay đổi một chút khi đặt 1 cell vào hàng đợi tái sử dụng . Trong IOS 10 các cell hiện tại được giữ lại lâu hơn 1 chút ngay cả khi chúng đã biến khỏi màn hình. Việc thay đổi nhỏ này cho phép CollectionView tránh được việc tạo lại các cells nếu chúng ta đột ngột thay đổi hướng scroll khi đó các cells cần được hiển thị lại sẽ hiển thị.

Prefetching

Một trong những cải tiến hiệu năng tốt nhất của collectionview trong ios 10 đó chính là “prefetching”. Prefetching là một kỹ thuật mà bạn sẽ nhận được thông báo trước khi các cell sẽ được hiển thị. Do đó cung cấp thêm khả năng để có thể chỉnh sửa các cell trước khi nó được tạo. Prefeteching được cung cấp bởi protocol UICollectionViewDataSourcePrefetching và bao gồm 2 phương thức :

func collectionView(UICollectionView, prefetchItemsAt: [IndexPath]) // required
func collectionView(UICollectionView, cancelPrefetchingForItemsAt: [IndexPath]) // optional

Phương thức collectionView(_:prefetchItemsAt:) được gọi collectionview đã sẵn sàng để bắt đầu tạo ra các cell trước khi chúng được được thi trên màn hình. Ví dụ , nếu bạn có 1 mảng dataSourceArray được sử dụng để chứa các cell , bạn có thể làm mọi thứ như :

func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath]) {
	for indexPath in indexPaths {
		// calculate/update/collect some data
		dataSourceArray[indexPath.row] = updatedData
	}
}

Bây giờ nguồn dữ liệu của bạn đã sẵn sàng để hiển thị sau khi hàm cellForItemAtIndexPath được gọi bởi CollecionView.

Một vài điều lưu ý khi sử dụng prefetching :

  • CellForItemAtIndexPath có thể được gọi tới các cell liên tục trong view , bởi người dùng có thể cuộn đi cuộn lại trước khi nó hiển thị.
  • Hàm prefetchItemsAt chỉ cung cấp khả năng update dữ liệu cho các collection view cell chứ không phải cả cái cell đó. (ví dụ : bạn không thể trả về bất kỳ dữ liệu nào tới collection view.)
  • Apple khuyên rằng chúng ta không nên sử dụng nhiều task vụ cho 2 hàm willDisplayCell và didEndDisplayingCell, nên đặt phần lớn công việc cho hàm cellForItemAtIndexPath xử lý.
  • Tính năng prefetching là 1 “Adaptive Technology” và sẽ tự động thay đổi khi hàm prefetchItemsAt được gọi , trên thực tế khi chúng ta scroll quá nhanh thì hàm prefetchItemsAt hoàn toàn có thể disable chính nó đi.

Như đã đề cập ở trên , hàm cancelPrefetchingForItemsAt là 1 tính năng tuỳ chọn cho phép làm mới lại dữ liệu khi nạp trước 1 mảng các cells mà đã được huỷ bỏ bỏi CollectionView. Điều này có thẻ xảy ra khi bạn thay đổi hướng scroll hoặc làm gì đó quá nhanh để prefetching làm việc hiệu quả. Cuối cùng bạn hoàn toàn có thể vô hiệu hoá CollectionView prefetching bằng việc set thuộc tính isPrefetchingEnabled bằng false .

Ngoài ra thỳ hiện tại Apple cũng đã cung cấp Prefetching cho cả UITableView với protocol mới là UITableViewDataSourcePrefetching .

Với những cải tiến cho class UICollectionView hứa hẹn sẽ giúp cho lập trình viên mang lại trải nghiệm tốt nhất cho người dùng , Như chúng ta đã thấy , thỳ Prefetching hoàn toàn dễ sử dụng phải không nào .

*Bài viết này mình xin dừng tại đây hẹn gặp mọi người ở bài viết sau. *


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí