2

有什么办法可以增加交易性NSUserDefaults吗?我需要类似数据库处理程序上众所周知的开始 - 提交 - 恢复功能,因此在某些情况下我可以恢复对用户默认值的修改。当然,此用户默认值的其他用户将在事务期间被阻止写入。

注1:synchronize上述类的方法不会做这件事,因为:

  1. 根据文档,框架也会不时调用它
  2. 没有“还原”

注意2:我看到了dictionaryRepresentationregisterDefaults我可以实现自己的事务机制(在内存中保存旧默认值的副本/甚至在事务期间保存到 plist 中)。但也许有一个现成的解决方案?

我的用例:

我有一个类似向导的屏幕流程,用户可以在每个屏幕上编辑一些设置。在当前实现中,当用户移动到向导的下一个屏幕时,这些设置会立即存储在默认值中。现在这个向导可以被其他一些事件打断(甚至用户可以在任何屏幕上选择退出/取消向导),在这种情况下我想回滚修改。

4

1 回答 1

3

一种可能的解决方案是将设置值推迟到向导结束。这可以很容易地完成,例如使用一个代理来记录发送给它的消息,然后在真实的NSUserDefaults. 记录消息应该非常简单:

- (void) forwardInvocation: (NSInvocation*) invocation
{
    [invocations addObject:invocation];
}

invocations可变数组在哪里。重播消息也很简单:

- (void) replayOnTarget: (id) target
{
    for (NSInvocation *op in invocations)
        [op invokeWithTarget:target];
}

这样,向导就不必知道有关事务的任何信息。它将获取录制代理而不是预期的NSUserDefaults实例并照常发送消息。在调用代码知道向导成功后,它可以在共享用户默认值上重播来自代理的消息。(我在 GitHub 上添加了一些示例代码。)

也许这有点矫枉过正,但由于录制代理是通用的并且可以在其他情况下使用,也许它还不错。同样的事情也可以使用块来完成:

[transaction addObject:[^{
    [defaults setObject:… forKey:…];
} copy]];

transaction再次,可变数组在哪里。当向导成功时,您只需遍历数组并执行存储的块。

于 2012-05-24T15:43:50.113 回答