Код: Выделить всё
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5)
Вот код моей модели представления...
Код: Выделить всё
import Foundation
enum ViewState {
case loading
case error
case loaded
case emptyView
}
protocol PeopleListViewModelAction: ObservableObject {
func getPeopleList(urlStr: String) async
}
// MARK: - People List ViewModel Implementation.
@MainActor
final class PeopleListViewModel {
@Published private(set) var viewState: ViewState = .loaded
@Published var searchText = ""
private(set) var filteredPeople: [PeopleData] = []
private(set) var peopleLists: [PeopleData] = []
private let repository: PeopleCardsRepository
init(repository: PeopleCardsRepository) {
self.repository = repository
}
}
extension PeopleListViewModel: PeopleListViewModelAction {
func getPeopleList(urlStr: String) async {
viewState = .loaded
guard let url = URL(string: urlStr) else { return }
do {
let lists = try await repository.getPeopleList(for: url)
peopleLists = lists
viewState = peopleLists.isEmpty ? .emptyView : .loaded
} catch {
viewState = .error
}
}
}
extension PeopleListViewModel {
var searchResults: [PeopleData] {
guard !searchText.isEmpty else { return peopleLists }
return peopleLists.filter { $0.firstName.localizedStandardContains(searchText) }
}
}
Код: Выделить всё
import SwiftUI
struct PeopleListView: View {
// MARK: - Using State Object to make sure view model object will not destroyed or recreate.
@StateObject var viewModel: PeopleListViewModel
@State private var isErrorOccured = true
var body: some View {
NavigationStack {
VStack {
switch viewModel.viewState {
case .loading:
ProgressView()
case .loaded:
showPeopleListView()
case .error:
showErrorView()
case .emptyView:
EmptyView()
}
}
.navigationTitle(Text(LocalizedStringKey("People List")))
.searchable(text: $viewModel.searchText, prompt: "Please enter name..")
}.task {
await viewModel.getPeopleList(urlStr: Endpoint.peopleListURL)
}
}
@ViewBuilder
func showPeopleListView() -> some View {
List(viewModel.searchResults) { peopleList in
NavigationLink {
PeopleDetailsView(people: peopleList)
}label: {
PeopleCellView(people: peopleList)
}
}
}
@ViewBuilder
func showErrorView() -> some View {
ProgressView().alert(isPresented: $isErrorOccured) {
Alert(title: Text("Error Occured"),message: Text("Something went wrong"),
dismissButton: .default(Text("Ok")))
}
}
}
#Preview {
PeopleListView(viewModel: PeopleListViewModel(repository: PeopleRepositoryImplementation(networkManager: NetworkManager())))
}
[img]https://i. sstatic.net/MyrflopB.png[/img]
Вот скриншот приложения:

Подробнее здесь: https://stackoverflow.com/questions/790 ... search-bar