Флаги функций магазина для приложения iOS - PullRequest
0 голосов
/ 05 мая 2018

В моем приложении есть некоторые функции, которые используются для запуска только несколько раз. Например, руководство по адаптации должно быть показано один раз, а некоторые подсказки, объясняющие функции приложения, должны отображаться только до того, как пользователь наконец-то использует эти функции один или два раза.

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

Может быть, есть отличное решение для хранения флагов функций?

P.S. Базовые данные или область выглядят тяжелыми для этой задачи. Пока файлы .plist выглядят лучше

1 Ответ

0 голосов
/ 02 сентября 2018

Во-первых, как отметил в комментариях rmaddy, именно для этого и была разработана UserDefaults. У меня такое ощущение, что вы используете его таким образом, что это стало бременем, которое очень прискорбно. Вот несколько вещей, которые вы можете сделать, чтобы сделать его более простым и понятным.

  1. Создать расширение UserDefaults в отдельном файле.
  2. Добавьте вычисленные значения к расширению, используя ключевое слово #function, которому вы можете присвоить имя значения UserDefaults в качестве ключа, не используя жестко запрограммированную строку, которая может быть неправильно введена позже в коде.
  3. Используйте enum для инкапсуляции связанных значений, таких как флаги вашей функции.
  4. В зависимости от вашего использования вы можете добавлять пользовательские функции к вычисляемым значениям или функциям сопутствующих связей.

UserDefaults.swift

import Foundation

// MARK: - Features

/// Names of Features to be later accessed by raw value.
enum Features: String {
    case FeatureZ
    case FeatureX
    case FeatureW
}


extension UserDefaults {

    // MARK: - Onboarding

    /// Indicates whether or not the user completed account setup.
    /// - Returns: Bool
    var finishedAcountSetup: Bool {
        get { return bool(forKey: #function) }
        set { set(newValue, forKey: #function) }
    }

    /// Indicates whether or not the user completed the first part of onboarding
    /// - Returns: Bool
    var primaryOnboarding: Bool {
        get { return bool(forKey: #function) }
        set { set(newValue, forKey: #function) }
    }

    // counter for displaying the tool tip
    private var counterForToolTip: Int {
        get { return integer(forKey: #function) }
        set { set(newValue, forKey: #function) }
    }

    // Indicates whether or not the tool tip be shown
    var shouldShowToolTip: Bool {
        get {
            if (counterForToolTip > 2) {
                counterForToolTip = 0
                return true
            }
            return false
        }
    }

    var featureFlags: [String] {
        get {
            guard let array = stringArray(forKey: #function) else {
                return []
            }
            return array
        }
        set { set(newValue, forKey: #function) }
    }

    // Convience functions
    /// Sets all onboarding values
    func setAllOnboarding(to: Bool) {
        var onboardingValues = [finishedAcountSetup, primaryOnboarding]

        for (index, _) in onboardingValues.enumerated() {

            onboardingValues[index] = to
        }
    }

    /// Increment the tool tip counter by a integer
    /// If the counter is > 2 then the tool tip can show.
    func incrementToolTipCounter(by: Int = 1){
        counterForToolTip += by
    }



} 

Тем временем, в другом месте ...

UserDefaults.standard.featureFlags.append(Features.FeatureX.rawValue)
UserDefaults.standard.finishedAcountSetup = true
UserDefaults.standard.setAllOnboarding(to: false)
UserDefaults.standard.incrementToolTipCounter()

for (index, _ ) in UserDefaults.standard.featureFlags.enumerated() {
    print("\(UserDefaults.standard.featureFlags[index])")
}

if (UserDefaults.standard.featureFlags.contains(Features.FeatureX.rawValue)) {
    // Do something
}

// etc.
...