iOS 8 beta 5 中的今日扩展的 NSUserDefaults 是不是被破坏?

Posted

技术标签:

【中文标题】iOS 8 beta 5 中的今日扩展的 NSUserDefaults 是不是被破坏?【英文标题】:Is NSUserDefaults for Today Extensions broken in iOS 8 beta 5?iOS 8 beta 5 中的今日扩展的 NSUserDefaults 是否被破坏? 【发布时间】:2014-08-05 01:00:24 【问题描述】:

我的 Today Extensions 在 beta 4 上完美运行,我在 Today Extensions 首次加载时实现了一个简单的缓存。

let defaults = NSUserDefaults(suiteName: "group.ReadWidget") // app group 
var feed = [String: String]()

override func viewDidLoad() 
    getCache()

    // The feed is empty


func parseRSS() 
    ...
    // Parse in background

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
          self.parser = NSXMLParser(contentsOfURL:NSURL(string:url))
          self.parser.delegate = self
          self.parser.parse() // populate the feed
          self.saveCache()    // Save the feed
          ...
        )
    )


func saveCache() 
    defaults.setObject(feed, forKey:"feed")
    defaults.synchronize()


func getCache() 
    if defaults.objectForKey("feed") 
        feed = defaults.dictionaryForKey("feed") as [String : String]
    
    else 
        feed = [:]
    

在 beta 5 中,在 saveCache() 之后,当 getCache() 在 Today Extension 中重新加载时,我总是得到一个空字典。

我正在使用NSUserDefaults(suiteName:...) 来存储缓存。我也试过NSUserDefaults.standardUserDefaults(),结果是一样的。

顺便说一句,哪个NSUserDefaults 是加载和保存缓存的首选方法?缓存不与主应用共享。

【问题讨论】:

考虑名称:NSUserDefaults。不是NSUserDatabaseNSUserCache。此类数据存储最好不要使用默认值。 请提供一个完整的最小示例,可以复制到项目中并进行测试。 最好使用 NSUserDefaults 来处理带有几个字符串的简单字典?我认为这是 Apple 推荐的,尤其是对于 Today Extension。 我在更新到 Beta 5 后遇到了与 NSUserDefaults 相同的问题,所以这可能是一个错误。 你也使用字典作为数据类型吗?你面临什么问题? 【参考方案1】:

这行得通:

var defaults = NSUserDefaults.standardUserDefaults()
var feed = [String:String]()

func getCache() 
    if defaults.objectForKey("feed") 
        feed = defaults.dictionaryForKey("feed") as [String : String]
    
    else 
        feed = [:]
    
    println("feed: \(feed)")

【讨论】:

提要是一个全局变量。 getCache 和 saveCache 都使用它。有什么东西被清除了吗? 有区别吗? 不是真的,但你没有提供一个独立的 minimal 测试所以没有办法知道。 从可测试性(和设计)POV 来看,最好将值传入并返回,而不是使用诸如feed 之类的全局变量。在当前问题中,未显示feed 设置在saveCache() 之前的代码。 feed 在 self.parser.parse() 中设置,因为这是一个 RSS 解析器。没关系,因为很难将所有这些浓缩成一个最小的测试,但感谢您的帮助。该代码在 beta 5 之前有效。

以上是关于iOS 8 beta 5 中的今日扩展的 NSUserDefaults 是不是被破坏?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 今日小部件 - SLComposeViewController 未正确显示

iOS 8今日扩展的最大高度?

iOS 8 beta - Today 扩展无法识别嵌入式框架

在 iOS 8 beta 中开发应用扩展的最佳实践

iOS 8 移除今日扩展

团队作业8----第二次项目冲刺(beta阶段)5.24