【问题标题】:Saving an array of NSURL to NSUserDefaults将 NSURL 数组保存到 NSUserDefaults
【发布时间】:2015-03-07 08:10:21
【问题描述】:

我有一个这样的 NSURL 项目数组:

var array = [NSURL]()

我正在尝试将其保存到 NSUserDefaults:

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

将导致它崩溃,因为 NSURL 不能存储在 NSUserDefaults 中。

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

【问题讨论】:

    标签: swift nsuserdefaults nsurl


    【解决方案1】:

    您可以将您的 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)
      }
    }
    

    【讨论】:

    • 其实比字符串好
    【解决方案2】:

    保存时,保存网址的绝对字符串。加载时使用 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")
        }
    

    【讨论】:

    • 免责声明:内联写但应该没问题
    • 感谢您的回答,我所要做的就是创建一个 NSURL 的字符串数组,然后使用 NSURL(string: array[1]) 来使用数组中的字符串(在索引 1本例)作为 NSURL 类型。
    • 您的 KVC 示例似乎缺少 valueForKeyPath 参数的结束引号。我试图修复它,但系统不允许少于六个字符的编辑。
    • 没错。感谢您的提示!
    【解决方案3】:

    这可能会更快一点:

    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")
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-05
      • 2014-03-31
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      相关资源
      最近更新 更多