我是 Swift 的新手,对 SwiftUI 更是如此。我开始创建一个小的基本项目。我使用 Github API 来获取存储库列表。
所以我创建了一个“搜索栏”,因为 SwiftUI 没有 SearchBar 组件。每次更改我的 Textfield 内容时,我都想执行 fetch 操作。
我不希望经常调用 fetch 方法。我决定去抖动它。我面临一个问题,我找不到/理解示例。
我试图实现一个去抖解决方案,但它不起作用,我的应用程序崩溃了。
这是我的 BindableObject
import SwiftUI
import Combine
class ReposStore: BindableObject {
private var service: GithubService
let didChange = PassthroughSubject<Void, Never>()
@Published var searchText: String = ""
var repos: [Repository] = [] {
didSet {
didChange.send()
}
}
var error: String = "" {
didSet {
didChange.send()
}
}
var test: String = "" {
didSet {
didChange.send()
}
}
private var cancellable: AnyCancellable? = nil
init(service: GithubService) {
self.service = service
cancellable = AnyCancellable($searchText
.removeDuplicates()
.debounce(for: 2, scheduler: DispatchQueue.main)
.flatMap { self.fetch(matching: $0) }
.assign(to: \.test, on: self)
)
}
func fetch(matching query: String = "") {
print("### QUERY \(query)")
self.service.getUserRepositories(matching: query) { [weak self] result in
DispatchQueue.main.async {
print("### RESULT HERE \(result)")
switch result {
case .success(let repos): self?.repos = repos
case .failure(let error): self?.error = error.localizedDescription
}
}
}
}
}
这是我的观点
import SwiftUI
struct RepositoryList : View {
@EnvironmentObject var repoStore: ReposStore
@State private var userName: String = ""
var body: some View {
VStack {
NavigationView {
VStack(spacing: 0) {
HStack {
Image(systemName: "magnifyingglass").background(Color.blue).padding(.leading, 10.0)
TextField($repoStore.repoUser, placeholder: Text("Search")).background(Color.red)
.padding(.vertical, 4.0)
.padding(.trailing, 10.0)
}
.border(Color.secondary, width: 1, cornerRadius: 5)
.padding()
List {
ForEach(self.repoStore.repos) { repository in
NavigationLink(
destination: RepositoryDetail(repository: repository).environmentObject(self.repoStore)
) {
RepositoryRow(repository: repository)
}
}
}.navigationBarTitle(Text("Repositories"))
}
}
}
}
我尝试使用 Timer 并每 8 秒进行一次调度和操作,但这种方法会导致我的应用程序崩溃。
此外,我真的不知道用“@objc”注释声明一个函数是否是一个好习惯......
有人可以帮我实现一种正确的方法来消除 BindableObject 中的方法吗?
先感谢您 :)