gpt4 book ai didi

ios - NSUserDefaults 事务性

转载 作者:行者123 更新时间:2023-12-03 16:58:35 26 4
gpt4 key购买 nike

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

注1:上述类的synchronize方法不会执行此操作,因为:

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

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

我的用例:

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

最佳答案

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

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

其中调用是一个可变数组。重放消息也很简单:

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

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

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

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

其中 transaction 再次是一个可变数组。当向导成功时,您只需迭代数组并执行存储的 block 即可。

关于ios - NSUserDefaults 事务性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10739956/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com