Swift 如何修复 TextField Return 键中的长任务
Swift How to fix do long task in TextField Return key
在 Swift 中,我编写代码使用 TextField 搜索列表,用户在此处键入关键字,当用户按下 ReturnKey 时,此应用执行搜索任务,并在 tableview 中显示结果(在 TextField 下方)。
我写道:
func textFieldShouldReturn(textField: UITextField!) -> Bool {
var result = ArticleManager.GetListArticleSearch( textField.text , p: 1)
if( result.message == "success" ){
articles = result.articles
}
//textField.text = nil
textField.resignFirstResponder()
self.tblSearchResult?.reloadData()
return true
}
好像还可以。
但是当按下 return 键时,因为 GetListArticleSearch
在几秒钟内完成,所以几秒钟后键盘隐藏并 table 查看显示结果。那时,我的视图看起来不太好,我无法滚动,什么也做不了。
我想在按下 return 键时,立即隐藏键盘,显示加载视图,并在任务完成后,在 table 视图中显示列表结果。 (完成任务后不隐藏键盘
发生这种情况的原因,如您所说,是因为 GetListArticleSearch 需要一些时间才能完成,而之后的一切都在等待。您需要 运行 在不同的线程上执行此操作。现在它在主线程上 运行ning,这就是为什么你不能移动 table 等。你应该 运行 长时间在后台线程上执行任务并在其完成更新时 UI。像这样:
func textFieldShouldReturn(textField: UITextField!) -> Bool {
textField.resignFirstResponder()//hidekeyboard
//you can add activity indicator
//run thread
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)){
var result = ArticleManager.GetListArticleSearch( textField.text , p: 1)
if( result.message == "success" ){
articles = result.articles
}
//ui can be updated only from main thread
dispatch_async(dispatch_get_main_queue()){
self.tblSearchResult?.reloadData()
//stop activity indicator everything is done
}
}
return true
}
这是 GCD 的教程http://www.raywenderlich.com/79149/grand-central-dispatch-tutorial-swift-part-1
在 Swift 中,我编写代码使用 TextField 搜索列表,用户在此处键入关键字,当用户按下 ReturnKey 时,此应用执行搜索任务,并在 tableview 中显示结果(在 TextField 下方)。 我写道:
func textFieldShouldReturn(textField: UITextField!) -> Bool {
var result = ArticleManager.GetListArticleSearch( textField.text , p: 1)
if( result.message == "success" ){
articles = result.articles
}
//textField.text = nil
textField.resignFirstResponder()
self.tblSearchResult?.reloadData()
return true
}
好像还可以。
但是当按下 return 键时,因为 GetListArticleSearch
在几秒钟内完成,所以几秒钟后键盘隐藏并 table 查看显示结果。那时,我的视图看起来不太好,我无法滚动,什么也做不了。
我想在按下 return 键时,立即隐藏键盘,显示加载视图,并在任务完成后,在 table 视图中显示列表结果。 (完成任务后不隐藏键盘
发生这种情况的原因,如您所说,是因为 GetListArticleSearch 需要一些时间才能完成,而之后的一切都在等待。您需要 运行 在不同的线程上执行此操作。现在它在主线程上 运行ning,这就是为什么你不能移动 table 等。你应该 运行 长时间在后台线程上执行任务并在其完成更新时 UI。像这样:
func textFieldShouldReturn(textField: UITextField!) -> Bool {
textField.resignFirstResponder()//hidekeyboard
//you can add activity indicator
//run thread
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)){
var result = ArticleManager.GetListArticleSearch( textField.text , p: 1)
if( result.message == "success" ){
articles = result.articles
}
//ui can be updated only from main thread
dispatch_async(dispatch_get_main_queue()){
self.tblSearchResult?.reloadData()
//stop activity indicator everything is done
}
}
return true
}
这是 GCD 的教程http://www.raywenderlich.com/79149/grand-central-dispatch-tutorial-swift-part-1