[Video Summary] Ch. 6.6 Loading Paged JSON while Scrolling in SwiftUI (2024)
Mô tả nhanh
Video này hướng dẫn cách tải dữ liệu JSON theo trang khi người dùng cuộn trang trong SwiftUI, sử dụng một API Pokemon để minh họa. Video cũng trình bày cách đánh số các mục trong danh sách, hiển thị tổng số mục đã tải và tổng số mục có sẵn, và xử lý lỗi JSON khi không có dữ liệu trang tiếp theo.
Video
Mô tả chi tiết
Video này hướng dẫn cách tải dữ liệu JSON theo trang khi người dùng cuộn trang trong SwiftUI, sử dụng một API Pokemon để minh họa.

Các bước thực hiện:
- Đánh số các Pokémon:
- Thay vì duyệt mảng
creaturestrực tiếp, sử dụng0..<creatures.creatureArray.countđể có index. - Sử dụng index để truy cập từng
creaturetrong mảngcreatures.creatureArray. - Thêm số thứ tự vào trước tên Pokémon bằng cách sử dụng string interpolation và
index + 1.
- Thay vì duyệt mảng
- Thêm Toolbar hiển thị số lượng đã tải và tổng số:
- Sử dụng
.toolbarmodifier cho List, vớiplacement: .statusđể hiển thị thông tin ở cuối màn hình. - Hiển thị số lượng Pokemon đã tải (
creatures.creaturesArray.count) và tổng số Pokemon (creatures.counttừ API).
- Sử dụng
- Tải thêm trang khi cuộn:
- Sử dụng
LazyVStackbao quanhNavigationLinkđể task modifier chỉ được gọi khi view đó xuất hiện trên màn hình. - Sử dụng
.taskmodifier để kiểm tra khi một item cuối cùng trong danh sách xuất hiện. - Kiểm tra xem item đang hiển thị có phải là item cuối cùng trong
creaturesArrayhay không bằng cách so sánh thuộc tính name. - Kiểm tra xem
URLStringcó bắt đầu bằng "http" hay không (để đảm bảo có trang tiếp theo để tải). - Gọi hàm
getData()để tải trang tiếp theo.
- Sử dụng
- Cập nhật mảng
creaturesArray:- Trong
getData(), thay vì gán trực tiếpself.creaturesArray = returned.results, hãy thêm kết quả mới vào mảng hiện tại:self.creaturesArray += returned.results.
- Trong
- Xử lý lỗi khi không có trang tiếp theo:
- Khi không có trang tiếp theo, giá trị
nexttrong JSON sẽ lànull. - Thay đổi kiểu dữ liệu của
nexttrongReturnstruct thànhString?(optional string). - Sử dụng
return.next ?? ""để gán giá trị nếunextcó giá trị và gán string rỗng nếu nó là nil, tránh lỗi decode JSON.
- Khi không có trang tiếp theo, giá trị
- (Quan trọng) Đảm bảo cập nhật UI trên main thread:
- Sử dụng
Task { @MainActor in ... }khi cập nhật các thuộc tính của class (ví dụcreaturesArray,URLString) để đảm bảo chúng được cập nhật trên main thread, tránh lỗi UI khi data được load ở background thread.
- Sử dụng
Lời chúc
Chúc bạn có những kiến thức hữu ích từ video này. Đừng quên like và subscribe để theo dõi các video tiếp theo nhé!