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
。不是NSUserDatabase
或NSUserCache
。此类数据存储最好不要使用默认值。
请提供一个完整的最小示例,可以复制到项目中并进行测试。
最好使用 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 未正确显示