【问题标题】:Best practice tu run code only once and only when you open an app. Swift 4, Xcode 8.最佳实践你只在打开应用程序时运行代码一次。斯威夫特 4,Xcode 8。
【发布时间】:2025-12-11 00:15:01
【问题描述】:

我试图仅在应用打开时才运行一次函数。

背景

我在用户默认值中有一个存储数组(我们称之为storedArray),它的值来自一个可由用户修改的数组(userArray)。

问题1: 每次我打开应用程序时,storedArray 都有之前会话的值,当然 userArray 又是空的。因此,当 storedArray 再次从 userArray 中获取值时,storedArray 会丢失其先前的值。

问题 1 的解决方案:当您打开应用程序时,userArray 会填充 storedArray 的值(来自上一个会话)。

那里没问题。现在:

**问题2:**这必须在每次打开应用程序时只发生一次,否则 userArray 将开始多次附加 storedArray 值重复值。我想出了解决方案 1 和 2,编号 3 我尝试遵循其他帖子的建议,但未能理解并实施它。

可能的解决方案一:声明一个全局变量

Struct globalVariables{
static var x = 0
}

创建一个 if 语句,以便只在 globalVariables.x == 0 时运行所需的代码

if globalVariables.x == 0 { 
//code to append values from storedArray to userArray goes here
//Then give a new value to globalVariables.x so that the if never gets accessed again
globalVariables.x == 1
}

这可行,但我不知道这是否是一种好习惯。

可能的解决方案 2: 将只运行一次的代码放在 AppDelegate 文件中的应用程序函数中。

这个函数看起来像这样。

func application(_ application: UIApplication, 
didFinishLaunchingWithOptions launchOptions: 
[UIApplicationLaunchOptionsKey: Any]?) -> Bool {
//code to append values from storedArray to userArray goes here

}

这再次有效,但我不知道这是否是一个好习惯。

可能的解决方案 3: 如果我理解正确,其他帖子中建议的解决方案是使用单例。我永远无法真正完成这项工作,(或正确理解单例是什么)。

我用以下代码创建了一个新的 .swift 文件:

struct Service {

static let sharedInstance = Service(

func getStoredInfo () {

          //code to append values from storedArray to userArray goes here
    }
  }
}

然后在 viewDidLoad 中调用这个函数:

Service.sharedInstance.getStoredInfo()

每次 viewDidLoad 运行时仍会调用该函数。如果单例真的可以帮助我解决这个问题,那么我完全错过了关于单例是什么以及如何实现它的一些非常基本的东西。完全。

解决方案 1 和 2 是好的做法吗?也许还有其他解决方案?

谢谢!

【问题讨论】:

  • 我不明白你为什么有问题 2. 当你启动应用程序时,从默认值加载userArray。每次更新 userArray 时,也将其写回用户默认值。这就是你需要做的。您的问题似乎来自将存储的数据附加到userArray;不要那样做。只需将内容替换为存储的数组即可。比这一切更好的是不要使用用户默认值作为数据存储。
  • 您建议如何存储数据?
  • 核心数据是一种方式。

标签: ios swift singleton global-variables


【解决方案1】:

如果某些事情只需要在启动后完成,那么“应用程序 didFinishLaunchingWithOptions”绝对是要走的路。

问题:在 iOS 上,您无法控制应用何时终止。您需要存储应用程序的终止方式,以便恢复会话或开始新的会话。

【讨论】: