[Video Summary] Ch. 8.13 - Location Search with Debouncing in SwiftUI (2024)
Mô tả nhanh
Video này hướng dẫn cách tạo một view tìm kiếm địa điểm có khả năng tái sử dụng trong SwiftUI, cho phép người dùng nhập địa điểm và thu hẹp kết quả tìm kiếm theo thời gian thực. Video cũng giới thiệu kỹ thuật "debouncing" để tránh gửi quá nhiều truy vấn tới Apple cùng một lúc.
Video
Mô tả chi tiết
Video này hướng dẫn cách tạo một view tìm kiếm địa điểm có khả năng tái sử dụng trong SwiftUI, cho phép người dùng nhập địa điểm và thu hẹp kết quả tìm kiếm theo thời gian thực. Video cũng giới thiệu kỹ thuật "debouncing" để tránh gửi quá nhiều truy vấn tới Apple cùng một lúc.
Dưới đây là các bước chính được thực hiện trong video:
-
Tạo PlaceLookupView:
- Tạo một file SwiftUI View mới tên
PlaceLookupView. - Thêm một biến
@State private var searchTextđể lưu trữ text tìm kiếm. - Sử dụng
NavigationStackvàListđể hiển thị kết quả tìm kiếm (tạm thời hiển thị text input). - Thêm
.searchablemodifier để tạo search bar. - Thêm
.onChangemodifier để theo dõi thay đổi trongsearchTextvà thực hiện tìm kiếm (chức năng tìm kiếm sẽ được thêm sau). - Thiết lập
listStylelà.plain. - Thêm
navigationTitlevànavigationBarTitleDisplayModecho view. - Thêm một nút "Cancel" trong toolbar để dismiss view.
- Tạo một file SwiftUI View mới tên
-
Cập nhật ContentView:
- Tạo biến
@State private var sheetIsPresentedđể kiểm soát việc hiển thị sheet. - Thêm
.sheetmodifier vào cuối VStack để presentPlaceLookupView. - Thêm một nút để toggle
sheetIsPresentedvà trình bàyPlaceLookupView. - Chỉnh sửa nút "Cancel" trong
PlaceLookupViewthành "Dismiss".
- Tạo biến
-
Tạo Model Place:
- Tạo một file Swift mới tên
Place, là model để chứa thông tin về địa điểm. - Import
MapKitvàContacts. - Tạo struct
Placetuân theoIdentifiable. - Tạo private property
mapItem(MKMapItem) để lưu trữ thông tin địa điểm. - Khởi tạo Place với một
mapItem. - Tạo computed properties:
name(String): tên địa điểm.latitude(CLLocationDegrees): vĩ độ.longitude(CLLocationDegrees): kinh độ.address(String): địa chỉ, lấy từCNPostalAddressvà chuyển đổi thành một chuỗi duy nhất.
- Tạo một file Swift mới tên
-
Tạo ViewModel PlaceLookupViewModel:
- Tạo file Swift mới tên
PlaceLookupViewModel. - Import
MapKit. - Thêm
@MainActorvà@Observableđể đảm bảo cập nhật UI trên main thread. - Tạo class
PlaceLookupViewModel. - Thêm property
places(Array) để lưu trữ kết quả tìm kiếm.
- Tạo file Swift mới tên
- Tạo hàm
search(text: String, region: MKCoordinateRegion)(async, throws):- Tạo
MKLocalSearch.RequestvớinaturalLanguageQueryvàregion. - Tạo
MKLocalSearchtừ request. - Gọi hàm
search.start()(await) để thực hiện tìm kiếm. - Kiểm tra xem có kết quả trả về không, nếu không sẽ throw lỗi.
- Map các
MKMapItemtrong response thành mảngPlace.
- Tạo
- Kết nối PlaceLookupView với ViewModel:
- Thêm
@State var placeVM(PlaceLookupViewModel) vàoPlaceLookupView. - Thay đổi
Listđể iterate quaplaceVM.places. - Hiển thị
namevàaddresscủa mỗi place trong list. - Thêm
@State private var searchTask(Task<Void,Never>?) để quản lý các task tìm kiếm. - Thêm
.onChange(of: searchText)modifier để theo dõi thay đổi search text và thực hiện debouncing:- Cancel task đang thực thi (nếu có).
- Nếu search text rỗng, xoá mảng places hiện tại.
- Tạo task mới:
- Chờ 300ms (tránh gửi quá nhiều request).
- Kiểm tra task có bị cancel không, nếu có thì return.
- Gọi
placeVM.search()với search text mới và tìm kiếm trong vùng hiện tại.
- Thêm
.onAppearmodifier để khởi tạosearchRegionvới vị trí hiện tại của thiết bị. - Thêm
.onDisappearmodifier để cancel các task đang thực thi khi view biến mất.
- Thêm
- Chỉnh sửa lại khởi tạo
PlaceLookupViewtrongContentViewđể truyền vào biếnlocationManager.
-
Thêm hàm get Region vào LocationManager
- Thêm hàm
getRegionAroundCurrentLocation(radiusInMeters: CLlocationDistance = 10000) -> MKCoordinateRegion?vàoLocationManagerđể trả về 1 region xung quanh vị trí hiện tại với bán kính cho trước.
- Thêm hàm
-
Thử nghiệm trên Simulator
- Chạy ứng dụng trên simulator và test tính năng tìm kiếm địa điểm với các địa điểm khác nhau. Chú ý đến việc search radius sẽ ảnh hưởng đến kết quả tìm kiếm trên preview và trên simulator.
Video này cung cấp một hướng dẫn chi tiết về việc tạo một chức năng tìm kiếm địa điểm mạnh mẽ, kết hợp việc sử dụng các API của Apple, kỹ thuật debouncing và tốt nhất là khả năng tái sử dụng view tìm kiếm.
Chúc bạn có những trải nghiệm lập trình thú vị!