Mastering Table/Collection DiffableDataSource: คู่มือฉบับสมบูรณ์

Mar 27 2023
บทช่วยสอนนี้จะสาธิตกระบวนการ refactoring และการใช้งาน DiffableDataSource ใน UITableView หรือ UICollectionView
บทความนี้เป็นบทความต่อเนื่องจากบทความก่อนหน้านี้ สรุป ปัจจุบัน เมื่อเรารีเฟรชมุมมองตาราง เซลล์ทั้งหมดจะถูกโหลดใหม่

บทความนี้ เป็นบทความต่อเนื่องจากบทความ ก่อนหน้านี้

ภาพจาก Flaticon โดย DinosoftLabs

สรุป

ปัจจุบัน เมื่อเรารีเฟรชมุมมองตาราง เซลล์ทั้งหมดจะถูกโหลดใหม่ สิ่งนี้ยอมรับได้ในสถานการณ์ปัจจุบัน เนื่องจากเราคาดว่าจะได้รับข้อมูลใหม่ (จำนวนตลกแบบสุ่มในแต่ละครั้ง) อย่างไรก็ตาม สมมติว่าเรามีฟีดของโพสต์ที่อัปเดตไม่บ่อยนัก และการโหลดมุมมองตารางทั้งหมดซ้ำแต่ละครั้งส่งผลให้ต้องทำงานที่ไม่จำเป็น อีกตัวอย่างหนึ่งคือ เมื่อใช้การแบ่งหน้า ซึ่งเราเพิ่มรายการใหม่แล้วโหลดมุมมองตารางทั้งหมดซ้ำ แทนที่จะแสดงรายการใหม่เพียงอย่างเดียว เราสามารถทำสิ่งนี้ได้โดยไม่ต้องโหลดเซลล์ทั้งหมดใหม่โดยใช้reloadRows(at: with:)หรือreloadItems(at:)แต่จะต้องมีการคำนวณเพิ่มเติมเพื่อให้ indexPaths ที่ถูกต้อง ในกรณีดังกล่าว การใช้UITableViewDiffableDataSourceสามารถช่วยเราแก้ไขปัญหาเหล่านี้ได้โดยจัดการการดำเนินการที่ซับซ้อนทั้งหมดและอัปเดตเฉพาะการเปลี่ยนแปลงที่จำเป็นอย่างมีประสิทธิภาพ

แนวคิดคือการแทนที่เมธอดแหล่งข้อมูลก่อนหน้าUITableViewDiffableDataSourceด้วย นอกจากนี้ เราได้รีเฟรชมุมมองตารางด้วยตนเองโดยใช้didSetการสังเกตคุณสมบัติ

DiffableDataSource

นี่คือวัตถุที่คุณใช้ในการจัดการข้อมูลและจัดเตรียมเซลล์สำหรับมุมมองตาราง

ออบเจ็กต์แหล่งข้อมูลที่กระจายได้คือแหล่งข้อมูลชนิดพิเศษที่ทำงานร่วมกับออบเจ็กต์มุมมองตารางของคุณ มีลักษณะการทำงานที่คุณต้องการในการจัดการการอัปเดตข้อมูลและ UI ของมุมมองตารางด้วยวิธีที่เรียบง่ายและมีประสิทธิภาพ นอกจากนี้ยังสอดคล้องกับUITableViewDataSourceโปรโตคอลและให้การนำไปใช้สำหรับวิธีการทั้งหมดของโปรโตคอล

ในการเชื่อมต่อแหล่งข้อมูลที่ต่างกันกับมุมมองตาราง คุณสร้างแหล่งข้อมูลที่ต่างกันได้โดยใช้init(tableView:cellProvider:)ตัวเริ่มต้น โดยส่งผ่านมุมมองตารางที่คุณต้องการเชื่อมโยงกับแหล่งข้อมูลนั้น คุณยังส่งผ่านผู้ให้บริการเซลล์ ซึ่งคุณกำหนดค่าแต่ละเซลล์ของคุณเพื่อกำหนดวิธีการแสดงข้อมูลของคุณใน UI

การดำเนินการ

1. สร้างแหล่งข้อมูลที่แตกต่างกันและใช้ผู้ให้บริการเซลล์เพื่อกำหนดค่าเซลล์ของมุมมองตารางของคุณ

ภายในวงเล็บมุม เราต้องระบุประเภทส่วนเป็นIntและประเภทโมเดลเป็นJokeซึ่งต้องเป็นไปตามHashableโปรโตคอล

2. สร้างสถานะปัจจุบันของข้อมูล

โดยทั่วไปนี่คือรหัสที่เรามีอยู่tableView(_:cellForRowAt:)

3. แสดงข้อมูลใน UI

เราสร้างสถานะปัจจุบันของข้อมูลและแสดงข้อมูลใน UI โดยสร้างและใช้สแน็ปช็อต นอกจากนี้updateJokesเรายังอัปเดตสแนปชอตด้วยรายการใหม่ วิธีนี้ทำให้เราสามารถกำจัดjokesProperty Array ที่เราตั้งไว้ก่อนหน้าได้

4. อย่าลืมเชื่อมต่อแหล่งข้อมูลที่แตกต่างกันกับมุมมองตารางของคุณ

tableView.dataSource = dataSource

Apple เปลี่ยนลักษณะการทำงานของเมธอดapply(_:animatingDifferences:)ของคลาสUITableViewDiffableDataSourceและUICollectionViewDiffableDataSourceคลาส

บน iOS 14 และก่อนหน้านี้ การโทรเทียบเท่าapply(snapshot, animatingDifferences: false)กับการโทร reloadDataและการโทรapply(snapshot, animatingDifferences: true)จะดำเนินการแตกต่างกับแหล่งข้อมูลและอัปเดตเฉพาะเซลล์ที่ข้อมูลเปลี่ยนแปลงเท่านั้น

ตั้งแต่ iOS 15 เป็นต้นไป การใช้สแน็ปช็อตโดยใช้ API นี้จะ ทำผลต่าง เสมอโดยเลือกที่จะทำให้การอัปเดต UI เคลื่อนไหวตามค่าanimatingDifferencesของ

หากต้องการโหลดทั้งตาราง/คอลเล็กชันใหม่อย่างชัดเจนโดยไม่ทำให้ต่างกัน คุณสามารถเรียกใช้applySnapshotUsingReloadData(_:completion:)แทนได้

โปรดคำนึงถึงความแตกต่างและเลือกวิธีการที่เหมาะสมกับความต้องการของคุณ

โครงการมีอยู่บนGitHub

ขอบคุณที่สละเวลาอ่านบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์สำหรับคุณ อย่าลังเลที่จะแสดงความคิดเห็นหรือถามคำถามใด ๆ ที่คุณอาจมี