Приложение MacOS: не позволяйте изменениям синхронизации перезаписывать ввод пользователя - PullRequest
0 голосов
/ 17 января 2019

Xcode 10.1, Swift 4.2, Realm 3.12 (база данных)

У меня есть приложение Mac, в котором несколько пользователей работают совместно и данные синхронизируются на нескольких устройствах. Таким образом, данные постоянно меняются.

Во всем приложении я пишу код, который обновляет пользовательский интерфейс при синхронизации в фоновом режиме. Проблема, с которой я продолжаю сталкиваться, заключается в том, что, когда пользователь печатает NSTextField, произойдет синхронизация (из-за изменений другого пользователя), и NSTextField, где он печатает, внезапно вернется к новому значению синхронизации, и пользователь потеряет то, что они напечатали.

Вот демонстрационное приложение для Mac, которое я собрал, которое имитирует проблему. Если вы начинаете вводить данные в поле, каждые 10 секунд поле обновляется: https://d.pr/f/8iXjqx

Мне интересно, какие стратегии использовали другие разработчики Mac, чтобы избежать этих столкновений.

Есть ли способ указать NSTextField не обновлять, если в нем присутствует курсор? Нужно ли сохранять значение в моей локальной базе данных при каждом нажатии клавиши, а затем каким-либо образом выполнять слияние при синхронизации?

1 Ответ

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

В ваших текстовых полях я бы узнал, активны ли вы:

override func becomeFirstResponder() -> Bool
    {
        isFirstResponder = true
        return super.becomeFirstResponder()
    }

    override func resignFirstResponder() -> Bool
    {
        isFirstResponder = false
        return super.resignFirstResponder()
    }

Затем, когда вы собираетесь обновить текст, оставьте его, если этот флаг установлен.

Предполагая, что вы не хотите каким-либо образом объединять текст, обновите текст до значения модели, если при выходе в отставку не было сделано никаких изменений, в противном случае запишите изменение обратно в модель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...