Swift Как исправить длинную задачу в клавише возврата TextField

В Swift я пишу код для создания списка поиска с помощью TextField, чтобы пользователи ввели здесь ключевое слово, и когда пользователи нажимают ReturnKey, это приложение выполняет задачу поиска и показывает результат в виде таблицы (ниже 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
    }

Кажется, все в порядке. Но когда вы нажимаете клавишу возврата, потому что GetListArticleSearch выполняется за несколько секунд, поэтому через несколько секунд клавиатура скрывается, а результат отображения таблицы. В то время мой вид выглядел не очень хорошо, я не могу прокручивать, ничего не могу сделать. Я хочу, чтобы при нажатии клавиши возврата немедленно скрывалась клавиатура, отображалось представление загрузки, а когда задача выполнялась, отображался результат списка в виде таблицы. (Не скрывать клавиатуру, когда задача выполнена.


person Sonrobby    schedule 05.03.2015    source источник


Ответы (1)


Причина, по которой это происходит, как вы сказали, заключается в том, что GetListArticleSearch требует некоторого времени для завершения, и все, что после этого, ждет. Вам нужно запустить это в другом потоке. Теперь он работает в основном потоке, поэтому вы не можете перемещаться с таблицей и т. Д. Вы должны запускать длительные задачи в фоновом потоке и после завершения обновления пользовательского интерфейса. Что-то вроде этого:

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

person IxPaka    schedule 05.03.2015