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