如何在应用程序首次加载时运行函数

时间:2015-08-26 15:04:59

标签: ios swift

我试图在Swift中编写一个简单的待办事项列表,它将列表存储为字符串数组,然后在应用程序加载时从内存中调用它。

我已获得以下代码:

var itemList = [String]()

func loadData() -> [String] {
    var arr = [String]()

    if NSUserDefaults.standardUserDefaults().objectForKey("storedData") != nil {
        arr = NSUserDefaults.standardUserDefaults().objectForKey("storedData")! as! [String]
    }
    else {
        arr = ["Nothing to do..."]
    }

    return arr
}

func saveData(arr: [String]) {
    NSUserDefaults.standardUserDefaults().setObject(arr, forKey: "storedData")
}

我遇到的问题是在哪里调用loadData()。这是一个具有两个视图控制器的应用程序(一个用于列表,一个用于添加项目设置),因此如果我在主视图控制器的viewDidLoad()中放置loadData()调用,则从内存中调用该数组每次切换回主视图控制器时(并覆盖)。

在应用程序启动时,调用它的最佳位置在哪里才能加载一次?

3 个答案:

答案 0 :(得分:7)

  

每次切换回主视图控制器时,都会从内存中调用数组(并重写)。

没有。应用启动时,viewDidLoad仅加载一次。每次viewcontroller更改时,只会调用viewWillApprearviewDidAppear

您还可以使用if let

使代码更紧凑
  if let storedData = NSUserDefaults.standardUserDefaults().objectForKey("storedData") as! [String]{
     arr = storedData
  }

但是如果您想确保只加载一次,可以将其放在AppDelegate方法的applicationDidFinishWithOptions文件中。

但是您必须在AppDelegate文件中创建一个可以从viewController访问的变量。

答案 1 :(得分:0)

分别使用或覆盖

application(_:didFinishLaunchingWithOptions:)
你的申请代表的

。 只在应用程序启动时调用一次。 看到 https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/#//apple_ref/occ/intfm/UIApplicationDelegate/application:didFinishLaunchingWithOptions

答案 2 :(得分:0)

在首次加载单个控制器的视图后调用viewDidLoad。对于单个viewController的生命周期,不应该多次调用它。也许有可能,如果你不打电话" super.viewDidLoad()"在你自己的viewDidLoad方法中,那么它可能会被再次调用?虽然您通常可以假设应用程序的rootViewController只创建一次,但我认为理论上可能的是,如果需要它可能会被应用程序清除内存,然后再次重新创建 - 所以我永远不会假设它#&# 39; s只调用一次。

你可以做的一件事就是只要加载数据就将boolean(默认值为false)设置为true,如果标志已设置为true,则不再调用它。

或者,将数据管理与viewControllers分开是一个好主意。一个相对简单的解决方案是拥有一个名为" AppData"比方说,这可能是一个单身人士(所以你只能有一个实例)或你的AppDelegate成员。然后,在app delegate" applicationDidFinishLaunchingWithOptions方法中,您可以创建AppData类的一个实例并在其上调用loadData方法。此类将独立于当前显示的任何视图而生存,并且当前视图可以调用此对象上的方法以根据需要加载/保存/更新数据。