41 lines
1.4 KiB
Swift
41 lines
1.4 KiB
Swift
import SwiftUI
|
||
import Combine
|
||
|
||
class SearchViewModel: ObservableObject {
|
||
@Published var searchText = ""
|
||
@Published var users = [User]()
|
||
|
||
private var cancellables = Set<AnyCancellable>()
|
||
|
||
init() {
|
||
$searchText
|
||
.debounce(for: .milliseconds(500), scheduler: RunLoop.main)
|
||
.removeDuplicates()
|
||
.flatMap { query -> AnyPublisher<[User], Error> in
|
||
if query.isEmpty {
|
||
return Just([])
|
||
.setFailureType(to: Error.self)
|
||
.eraseToAnyPublisher()
|
||
} else {
|
||
return self.searchUsers(query: query)
|
||
.eraseToAnyPublisher()
|
||
}
|
||
}
|
||
.catch { _ in Just([]) } // При ошибке возвращаем пустой массив
|
||
.receive(on: RunLoop.main)
|
||
.assign(to: \.users, on: self)
|
||
.store(in: &cancellables)
|
||
}
|
||
|
||
func searchUsers(query: String) -> Future<[User], Error> {
|
||
Future { promise in
|
||
// Имитация сетевого запроса
|
||
let mockUsers = [
|
||
User(id: "1", username: "testuser1", email: "test1@test.com"),
|
||
User(id: "2", username: "testuser2", email: "test2@test.com"),
|
||
User(id: "3", username: query, email: "test3@test.com")
|
||
]
|
||
promise(.success(mockUsers))
|
||
}
|
||
}
|
||
} |