当文本框的内容发生变化时,我试图运行一些javascript/await代码,以从后端服务器获取一些结果并更新UI。
文本框在Swift中使用了这个searchTerm
published属性,但在didSet
中调用这个xlc方法会锁定UI。
//This is used to populate a list
@Published var results : ResultsData = ResultsData()
//This is used as a binding for a TextField
@Published var searchTerm: String = "a search term"{
didSet {
Task {
self.results = await searchService.GetData(searchTerm: searchTerm)
}
}
}
字符串
我试过使用await MainActor.run{
,results
的static
版本,甚至是全局变量来更新UI,但它没有工作,只要我在文本字段中键入一些东西,UI就会继续冻结。
如何在用户每次在文本字段中输入字符时调用这个fixc方法从后端获取结果?
3条答案
按热度按时间cgfeq70w1#
这里有两个主题:
1.看起来'var results'是您的'searchTerm'状态的函数。
将用于定义状态的特性标记为“@Published,"并将结果特性定义为函数或计算特性。
如果您发现自己设置了一个@Published属性,结果却设置了另一个,那么您可能应该重新考虑当前的模型。
请查看WWDC关于SwiftUI状态管理的讨论,了解此主题。
1.异步演示文稿处理
您当前“触发并忘记”了您得Task,这意味着您无法跟踪进度,保证完成顺序,去抖动,取消等.理想得解决方案可能是使用合并或Task handling(请参见Async search bar)来正确处理所有这些细节.
1和#2都可能导致您正在经历的那种UI冻结。
这是一个示例解决方案(没有额外的功能,如去抖动)。
字符串
pqwbnv8z2#
像下面这样使用带有id的任务
字符串
nafvub8i3#
Roy Rodney的回答让我找到了一个解决方案,包括去抖动,所有这些都在同一个SwiftUI文件中,而不需要ViewModel或发布的属性(并不是说使用这些有什么错)
下面是我如何实现我的解决方案,以便在每次用户在文本字段中输入键时调用我的pwdc方法。
字符串
这是在同一个SwiftUI文件中声明的searchTextPublisher
型