将NSURL数组保存到NSUserDefaults

时间:2015-03-07 08:10:22

标签: swift nsuserdefaults nsurl

我有一系列像这样的NSURL项目:

var array = [NSURL]()

我试图将其保存到NSUserDefaults:

let defaults = NSUserDefaults(suiteName: "group.a.project")
defaults?.setObject(array, forKey: "NSURLarray")

由于NSURL无法存储在NSUserDefaults中,因此会导致崩溃。

如何将这个NSURL数组保存到NSUserDefaults,以便我可以根据需要访问它并在数组中使用NSURL(保存一个字符串数组然后尝试使用它们)因为NSURL会导致xcode出错?

3 个答案:

答案 0 :(得分:7)

您可以将URL数组存档到NSData实例,并将其存储在用户默认值中。保存:

let urls = [ NSURL(string: "http://www.google.com")!, NSURL(string: "http://www.stackoverflow.com")! ]
let defaults = NSUserDefaults(suiteName: "group.a.project")
let data = NSKeyedArchiver.archivedDataWithRootObject(urls)

defaults?.setValue(data, forKey: "myUrls")

加载:

if let data = defaults?.valueForKey("myUrls") as? NSData {
  if let urlsArray = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? [NSURL] {
    println(urlsArray)
  }
}

答案 1 :(得分:5)

保存时,保存网址的绝对字符串。加载时使用NSURL(URLString :)将字符串重新设置为URL

import UIKit

class ViewController: UIViewController {
    var urlsArray : [NSURL]?

    func load () {
        var urls : [NSURL] = []

        let stringsArray = NSUserDefaults.standardUserDefaults().objectForKey("stringsArray") as [String]?

        if let array = stringsArray {
            for string in array {
                var url = NSURL(string: string)
                urls.append(url!) //no null check
            }
        }

        self.urlsArray = urls
    }

    func save () {
        var strings : [String] = []

        if let array = self.urlsArray {
            for url in array {
                var string = url.absoluteString
                strings.append(string!) ////no null check
            }
        }

        NSUserDefaults.standardUserDefaults().setObject(strings, forKey: "stringsArray")
    }


}

使用KVC可以减少保存。

    func save () {
        var strings : [String] = []

        if let array = self.urlsArray as NSArray? {
            strings = array.valueForKeyPath("absoluteStrings")
        }

        NSUserDefaults.standardUserDefaults().setObject(strings, forKey: "stringsArray")
    }

答案 2 :(得分:0)

这可能会更加迅速:

func load () {
    if let stringsArray = NSUserDefaults.standardUserDefaults().objectForKey("stringsArray") as? [String] {
        self.urlsArray = stringsArray.compactMap { URL(string: $0) }
    }
}

func save () {
    NSUserDefaults.standard.setObject(self.urlsArray.map { $0.absoluteString }, forKey: "stringsArray")
}