Мастер TornadoFX: блокировать переход на следующую страницу до завершения асинхронной задачи - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь настроить страницу мастера TornadoFX, и на одной из моих страниц есть выбор элемента.Этот выбор вызывает более длительную задачу загрузки данных.Поэтому на странице при изменении выбора я только устанавливаю вид прокси-значения (типа BoardDefinition):

private fun loadBoard(def: BoardDefinition) {
    scope.boardDef = def
}

При этом я избегаю ненужной загрузки данных, пока пользователь принимает решение.Мое намерение состояло в том, что только когда пользователь решает двигаться дальше, прокси-сервер расслабляется и данные загружаются.Я попытался переместить загружаемую часть в onSave, но при асинхронной загрузке мастер переходит на следующую страницу (и эта страница пытается использовать данные, все еще загружаемые):

override fun onSave() {
    runAsync {
        showProgress(
            "Játéktábla betöltése",
            "A játéktábla betöltése folyamatban",
            ProgressDialog.ProgressMode.INDICATOR,
            this
        )
        // This lazy initialization performs the long-time data loading
        scope.board = scope.boardDef.board
    } ui {
        ProgressDialog.hide()
        super.onSave()
    }
}

У меня естьнесколько идей, как решить эту проблему.Я мог бы создать объект Future и заблокировать выполнение onSave, пока доступны данные.Или я мог бы добавить страницу, которая только загружает данные, и свойство onComplete установлено для контроля, закончена ли загрузка.И то и другое похоже на взлом.Есть ли более элегантный способ выполнить некоторое время асинхронной задачи, когда пользователь нажимает Next?

1 Ответ

0 голосов
/ 26 февраля 2019

После некоторых неудачных попыток я решил проблему с помощью этого поворота:

Я создал представление загрузки:

class LoadBoardView : View() {

    class Scope(val source: <Your source type>, var loaded: <Your loaded type>) 
        : tornadofx.Scope()

    override val scope = super.scope as Scope

    override fun onDock() {
       super.onDock()

       runAsync {
           // Do the loading into scope.loaded
       } ui {
           close()
       }
   }

}

Это представление начинает загрузку сразу после шоу и закрывается после завершения.

На своей странице мастера я просто использую заблокированное выполнение:

override fun onSave() {
    val loaderScope = LoadBoardView.Scope(<your id to load>)
    find<LoadBoardView>(loaderScope).apply {
        openModal( block = true)
    }
    // Get loaded value from loaderScope.loaded
    super.onSave()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...