我正在尝试对新的视图控制器执行segue,但是segue被调用两次,新的视图控制器出现两次。
我正在使用一种对API执行GET请求的方法检索数据。
该方法使用完成处理程序。
func getSearchResultsForQuery(_ query: String, completionHandlerForSearchResultsForQuery: @escaping (_ success: Bool, _ error: NSError?) -> Void)
当方法成功完成时,我会根据需要从主队列中调用segue。
我已经设置了断点,所以我可以看到发生了什么,执行从performSegue跳回到条件,检查方法是否成功,然后继续直到第二次调用segue。我尝试了一个纯粹的程序设计,但结果是一样的。
我还添加了一个print语句,如果我注释掉segue,那么print语句只被调用一次。
之前我曾经多次使用过这种模式,从来没有遇到任何问题我只是无法弄清楚为什么会发生这种情况。
这次我唯一不同的是使用Swift 3并使用DispatchQueue.main.async而不是dispatch_async(dispatch_get_main_queue()。
这是给我这个问题的函数:
@IBAction func search(_ sender: UIButton) {
let searchQuery = searchField.text
TIClient.sharedInstance().getSearchResultsForQuery(searchQuery!) { (success, error) in
if success {
print("Food items fetch successful")
DispatchQueue.main.async {
print("Perorming segue for food item: \(searchQuery)")
self.performSegue(withIdentifier: "showFoodItems", sender: self)
}
} else {
print("error: \(error)")
}
}
}
编辑:我从来没有发现问题是什么,但完全删除故事板并重新创建它解决了它。
答案 0 :(得分:0)
我知道这不是修复这个问题的好方法,而且由于信誉不好我也不能发表评论但是如果你在DispatchQueue.main中包装整个if语句会发生什么?
@IBAction func search(_ sender: UIButton) {
let searchQuery = searchField.text
TIClient.sharedInstance().getSearchResultsForQuery(searchQuery!) { (success, error) in
DispatchQueue.main.async {
if success {
print("Food items fetch successful")
self.performSegue(withIdentifier: "showFoodItems", sender: self)
} else {
print("error")
}
}
}
会产生不同的结果还是会产生相同的结果?检查Bool并不需要太多的处理能力,因此我不认为将它放在主队列中是一件坏事,但我这样做是为了解决问题。对不起,我不能对此发表评论。
答案 1 :(得分:0)
签入故事板,也许你从按钮动作而不是控制器设置segue。