有没有办法向NSUserDefaults
添加交易?我需要像数据库处理程序上众所周知的begin - commit - revert函数,因此在某些情况下我可以恢复对用户默认值的修改。当然,在交易期间,此用户默认的其他用户将被阻止写入。
注意1:上述类的synchronize
方法不会执行此操作,因为:
注意2:我看到了dictionaryRepresentation
和registerDefaults
,我可以实现自己的事务机制(在内存中保存旧默认值的副本/甚至在事务期间保存到plist中)。但也许有一个现成的解决方案吗?
我的用例:
我有类似向导的屏幕流,用户可以在每个屏幕上编辑一些设置。从当前实现开始,当用户移动到向导的下一个屏幕时,这些设置会立即存储在默认值中。现在这个向导可以被其他一些事件打断(即使用户可以选择在任何屏幕上退出/取消向导),在这种情况下我想回滚修改。
答案 0 :(得分:3)
一种可能的解决方案是将值设置推迟到向导结束。这可以很容易地完成,例如使用代理来记录发送给它的消息,然后在真实的NSUserDefaults
上重放它们。录制消息应该非常简单:
- (void) forwardInvocation: (NSInvocation*) invocation
{
[invocations addObject:invocation];
}
invocations
是一个可变数组。重播消息也很简单:
- (void) replayOnTarget: (id) target
{
for (NSInvocation *op in invocations)
[op invokeWithTarget:target];
}
这样,向导不必知道有关事务的任何信息。它将获取录制代理而不是预期的NSUserDefaults
实例并像往常一样发送消息。在调用代码知道向导成功后,它可以在共享用户默认值上重放来自代理的消息。 (我添加了一些sample code on GitHub。)
也许这有点矫枉过正,但由于录制代理是通用的,可以在其他情况下使用,也许它并不坏。使用块也可以完成同样的事情:
[transaction addObject:[^{
[defaults setObject:… forKey:…];
} copy]];
transaction
又是一个可变数组。当向导成功时,您只需遍历数组并执行存储的块。