Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 事务性_Ios_Cocoa_Transactions_Nsuserdefaults - Fatal编程技术网

Ios 事务性

Ios 事务性,ios,cocoa,transactions,nsuserdefaults,Ios,Cocoa,Transactions,Nsuserdefaults,有没有办法将事务性添加到NSUserDefaults?我需要在数据库处理程序上使用众所周知的begin-commit-revert函数,因此在某些情况下可以恢复对用户默认值的修改。当然,此用户默认值的其他用户在事务期间将被阻止写入 注1:synchronize上述类的方法不执行此操作,因为: 根据文档,框架也会不时调用它 没有“恢复” 注2:我看到了dictionaryRepresentation和registerDefaults,因此我可以实现自己的事务机制(在内存中保留旧默认值的副本/甚至在

有没有办法将事务性添加到
NSUserDefaults
?我需要在数据库处理程序上使用众所周知的begin-commit-revert函数,因此在某些情况下可以恢复对用户默认值的修改。当然,此用户默认值的其他用户在事务期间将被阻止写入

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

  • 根据文档,框架也会不时调用它
  • 没有“恢复”
  • 注2:我看到了
    dictionaryRepresentation
    registerDefaults
    ,因此我可以实现自己的事务机制(在内存中保留旧默认值的副本/甚至在事务期间保存到plist)。但也许有现成的解决办法

    我的用例:


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

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

    - (void) forwardInvocation: (NSInvocation*) invocation
    {
        [invocations addObject:invocation];
    }
    
    其中,
    调用
    是一个可变数组。将消息回放也很简单:

    - (void) replayOnTarget: (id) target
    {
        for (NSInvocation *op in invocations)
            [op invokeWithTarget:target];
    }
    
    这样,向导就不必知道有关事务的任何信息。它将获取录制代理,而不是预期的
    NSUserDefaults
    实例,并像往常一样发送消息。调用代码知道向导成功后,它可以在共享用户默认值上重播来自代理的消息。(我补充了一些。)

    也许这太过分了,但由于录制代理是通用的,可以用于其他情况,所以可能还不错。同样的事情也可以使用块来完成:

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

    其中,
    事务
    也是一个可变数组。当向导成功时,您只需在数组上迭代并执行存储的块。

    github中有一个几乎可以满足您需要的功能。-saveDataToFile方法在功能上等同于commit。它没有还原功能,但如果您想修改它,则会提供源代码。@zoul我有一个类似向导的屏幕流,用户可以在每个屏幕上编辑一些设置。在当前实施中,当用户移动到向导的下一个屏幕时,这些设置将立即存储在默认设置中。现在,此向导可能会被一些其他事件中断(甚至用户可以在任何屏幕上选择退出/取消向导),在这种情况下,我希望回滚修改。@progrmr谢谢,如果我决定按照我在备注2中描述的方式继续,它肯定会很有用。。。现在我想知道是否还有其他的可能性。