按顺序执行函数调用



每次用户编辑文本字段并根据输入搜索用户时,我都会尝试获取用户输入。在搜索功能的开头,我删除了用户数组并执行搜索。但是,该函数是并发调用的,它甚至在执行搜索之前清空数组。这可能会导致用户数组中出现重复数据。有没有办法序列化整个函数调用?我浏览了GCD文档并尝试实现一些方法,但没有成功。

这是源代码

// handles editting movement of the search textfield
@objc func textIsChanging(){
//need to serialize execution to avoid concurrency.
// wait until previous call completes? 
searchUsers()
}
// search user from database.
private func searchUsers(){
// empty user array and reload table view
removeUsers()
if let searchText = searchField.text?.lowercased() {
// search with starting index..
Api.User.queryUsersWithStartText(withText: searchText) { (user) in
if(CurrentUserInfo.uid != user.uid){
self.users.append(user)
self.tableView.reloadData()
}
}
}
}

您可以使用DispatchGroup按顺序执行异步函数。您需要确保DispatchGroup上的enter()leave()调用是平衡的,如果这样做,则dispatchGroup.notify(queue: DispatchQueue.main) {...}中的代码仅在DispatchGroup中当前存在块时才执行,因此可以安全地添加另一个块。通过从dispatchGroup.notify内部调用searchUsers(),可以确保仅在函数的上一次调用完成执行后调用该函数。

let dispatchGroup = DispatchGroup()
@objc func textIsChanging(){
dispatchGroup.notify(queue: DispatchQueue.main) {
searchUsers()
}
}
// search user from database.
private func searchUsers(){
dispatchGroup.enter()
// empty user array and reload table view
removeUsers()
if let searchText = searchField.text?.lowercased() {
// search with starting index..
Api.User.queryUsersWithStartText(withText: searchText) { (user) in
if(CurrentUserInfo.uid != user.uid){
self.users.append(user)
self.tableView.reloadData()
}
dispatchGroup.leave()
}
} else {
dispatchGroup.leave()
}
}

最新更新