持久的应用数据

时间:2016-03-07 21:36:26

标签: ios swift

我对编程很新,但此刻。我可以在第二个屏幕上查看我的堆栈中的计算。一旦应用程序项目重置,堆栈就很清楚了。我的问题是,一旦应用程序退出,我如何在第二个视图中保持堆栈。

class ViewController: UIViewController {
    var name = Array<String>()

    @IBOutlet weak var labelDisplay: UILabel!

    var calcEngine : CalculatorEngine?

    override func prepareForSegue(segue: UIStoryboardSegue,
            sender: AnyObject?) {
        if segue.identifier == "pushToNextView"
        {
            let secondVC: SecondVCViewController = segue.destinationViewController as! SecondVCViewController
            secondVC.data = self.name
        }
    }

第二种观点

class SecondVCViewController: UIViewController {
    @IBOutlet weak var textData: UITextView!

    var data = Array <String>()

    override func viewDidLoad() {
        super.viewDidLoad()

        for(var i = 0; i < self.data.endIndex; i++ ){
            self.textData.text = self.textData.text! + self.data[i] + "\n"
        }

        // Do any additional setup after loading the view.
    }

3 个答案:

答案 0 :(得分:1)

您可以使用许多工具来保存应用中的数据。选择合适的一个需要了解您的需求,或至少做出猜测。这是我要开始的地方,但请注意我的假设与您的需求不符。

您希望保留哪种类型的数据?

据推测,您希望存储var name = Array<String>()中看到的字符串数组,但也许您还有其他一些数据类型。

你什么时候需要读/写它(你需要担心多个系统同时尝试写入,加载数据会非常昂贵,因为它非常大,你是否只有需要一次加载一小块,...)?

听起来您可以一次性读取/写入所有数据,并且只能在应用启动/终止时使用。此计算历史记录的最大大小可能合理,总存储大小可能相当小。

需要持续多长时间?

计算历史通常很好,但如果失踪则不会造成灾难性的损失。保留这些数据会很好,但应用程序可以在没有它的情况下运行。根据使用情况,如果意外删除数据,则可能会花费或不会花费用户时间和挫败感。

谁需要访问它(它是否也显示在网站上,是否应该同步到用户的所有设备,......)?

将这段历史记录保存在本地设备上可能已经足够了。

那我们该怎么办?

对于一次性加载的少量数据,仅在本地使用,我会将此数据写入文件。

由于您只是处理一组字符串,我们可以使用plist(https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/PropertyLists/AboutPropertyLists/AboutPropertyLists.html

NSArray(注意:不是Swift数组)有arrayWithContentsOfURL:writeToURL:atomically:,这是读取和写入plist兼容数据的便捷方式。

使用文件意味着我们需要决定存储此文件的位置。看看Where You Should Put Your App’s Files。在这种情况下,将此数据写入DocumentsLibrary/Caches似乎是合理的,具体取决于您打算如何使用它。

有了这些,我们可以保存这个堆栈:

let array = names as NSArray guard let cachesURL = NSFileManager.defaultManager().URLsForDirectory(.CachesDirectory, inDomains: .UserDomainMask).first else { print("Unable to find Caches directory, cannot save file.") return } let fileURL = cachesURL.URLByAppendingPathComponent("history.plist") array.writeToURL(fileURL, atomically: false)

阅读文件类似。您将需要相同的URL,因此决定哪个组件负责决定保存/加载此数据的位置,并让它提供要使用的URL。您还需要检查是否存在任何已保存的历史记录(请注意arrayWithContentsOfURL:可以返回nil)。

在某些时候,您可能会发现将此数据建模为更具体的数据类型很有用,可能会定义您自己的结构来捕获这些操作。自定义类型无法自动写入文件或从文件中读取,因此您需要再做一些工作。 Apple有一个很好的例子,说明如何使用NSCoding在他们的教程中执行此操作:https://developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson10.html

答案 1 :(得分:0)

保留和恢复状态

您正在寻找的功能称为状态恢复。来自docs

  

状态保存会先记录您应用的配置   暂停,以便后续配置可以恢复   应用程序启动。

如何解决这个问题:

  1. 标记您的视图控制器以进行保存。分配恢复标识符。
  2. 在启动时恢复视图控制器。对其状态进行编码和解码。
  3. 主题非常广泛但docs解释得非常好。

答案 2 :(得分:-1)

您尝试做的是在应用程序启动之间保留持久数据,对吗?

为此您应该使用核心数据,网上有许多有用的资源可以帮助您,还有一些有用的资源。

https://developer.apple.com/library/watchos/documentation/Cocoa/Conceptual/CoreData/index.html https://www.raywenderlich.com/934/core-data-tutorial-for-ios-getting-started