Лучший вариант для мониторинга пользовательского интерфейса, избегая состояния - PullRequest
0 голосов
/ 13 декабря 2018

Я довольно новичок в разработке Swift и iOS.Я узнал и стремился к цели использования функционального программирования, чтобы избежать состояния.Поэтому я нахожусь на этапе моего путешествия, где я хотел бы задать концептуальный вопрос о методах программирования для достижения этой цели.

Скажем, у меня есть обычный UIS-переключатель на обычном UIView, который управляется обычным UIViewController.Несколько методов в классе ViewController зависят от значения UISwitch, чтобы определять их точное действие.

Я начал с проверки значения UISwitch в каждом методе по мере необходимости, но это приводило к предупреждениям при вызове этих методовасинхронно в фоновом потоке.Я знал, что не могу вносить изменения в пользовательский интерфейс в фоновом потоке, но, похоже, я тоже не могу проверить его состояние.

Поэтому я прибег к старому избранному - свойству класса - для сохранения текущегосостояние переключателя, но создается впечатление, что при этом я иду против фундаментального принципа функционального программирования.

Затем я понял, что позволить переключателю оставаться в том виде, в котором пользователь оставил его после того, как приложениезакрыто, мне нужно было записать его настройки в UserDefaults.Поэтому я могу получать значение из UserDefaults каждый раз, когда мне это нужно, но моя проблема здесь заключается в том, что этот подход может быть значительно медленнее, учитывая необходимость для iOS переходить назад и вперед к UserDefaults.

Итак, мой вопросэто: каков наилучший / самый быстрый / наименее вероятный способ вызвать будущие проблемы способ получения этого параметра UISwitch в методах моего ViewController?

  1. Проверьте пользовательский интерфейс, отправив на главныйпоток каждый раз, когда необходимо проверить переключатель
  2. Сохраните значение в свойстве класса и повесьте последствия
  3. Получайте значение из UserDefaults каждый раз, когда это необходимо, или
  4. Любойдругой подход, о котором я еще не узнал

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Я рекомендую иметь свойство Bool для сохранения состояния объекта Switch.Обновляйте его каждый раз, когда изменяется состояние Control Switch.

Любой из этих методов должен иметь доступ к свойству Bool, а не к состоянию Control Switch напрямую.

Использование UserDefaults для пары настроек, которые необходимоупорствовать в порядке.Я бы порекомендовал загрузить начальное значение для Switch Control из пользовательских настроек по умолчанию в viewDidLoad(), но установить самое актуальное значение всякий раз, когда View Controller собирается исчезнуть или само приложение переходит в фоновый режим или собирается получитьуничтожен, потому что пользовательские настройки по умолчанию используют .plist под капотом, и любая операция может занять больше времени, чем ожидалось, и иногда это может привести к неожиданному поведению.

Кроме того, вы можете использовать класс SettingStateController, содержащий этот Bool имущество и другие вещи.Пусть он инициализирует все свойства из User Defaults внутри инициализатора и сохраняет их в User Default, когда его экземпляр освобождается.Таким образом, доступ будет быстрее, и код будет разделен на основе различных проблем.View Controller должен вести себя больше как представление, ответственность за принятие решения об использовании пользовательских настроек по умолчанию, локального файла, базовых данных и т. Д. Следует выполнять в отдельном классе, как указано выше.

0 голосов
/ 13 декабря 2018

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

Я предлагаю2 подхода:

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

var yourFlag : Bool {
    get {
        let defaults = Defaults.standard
        return defaults.bool(forKey: "yourFlagKey") 
    }

    set (newValue) {
        let defaults = Defaults.standard
        defaults.set(newValue, forKey: "yourFlagKey")
    }
}

Таким образом, вы можете просто использовать вашу переменную, как и любые другие переменные экземпляра, но вкапот это будет использовать UserDefaults.Например, в вашем действии изменения значения переключателя вы можете просто установить новое значение, и оно будет сохраняться на UserDefaults:

func onValueChanged(sender: UISwitch) {
   yourFlag = !sender.on
}

Я бы посоветовал не хранить эту переменную в вашем ViewController.Я обычно делаю контейнерный класс для всех своих пользовательских настроек, чтобы я мог проверить их там, где они мне нужны.В идеале вы хотели бы внедрить этот контейнер как зависимость для вашего UIViewController.

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

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