存储iOS应用的功能标志

问题描述 投票:0回答:1

在我的应用程序中,我有一些用于执行只有几次的功能。例如,登录指南应该显示一次,并且只有在用户最终使用此功能一次或两次之前,才需要显示解释应用程序功能的一些工具提示。

所以我需要把它存放在某个地方。现在我正在使用UserDefaults。这种方法相当简单,但是当您需要存储和更新许多功能标志时,这种方法并不那么优雅。

也许有一些很好的存储功能标志的解决方案?

附: Core Data或Realm看起来很重要。而.plist文件看起来更好

ios nsuserdefaults plist userdefaults
1个回答
0
投票

首先,正如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.
© www.soinside.com 2019 - 2024. All rights reserved.