2011-03-30 55 views
9

我让用户在iPhone的设置区域中更改其设置。在下一次网络同步期间,我希望将用户更改发送到服务器。但只有在做出更改之后。如何知道用户何时更改设置包

但我如何知道用户在设置区域内进行了更改?

如果可以的话,我希望避免无论是否更改或不从服务器首先获取信息并更新(如果与用户默认设置不同),始终发送信息。

解决这个问题有没有一个不错而优雅的方法? 谢谢你的帮助!

一个星期后,没有答案... 这个问题太难或它没有任何意义?

回答

16

啊傻我!在这里,我们以优雅的方式去。在XCode内的Apple文档中搜索AppPrefs,它将显示一个示例应用程序,它正是您想要做的事情。只需编译并运行!它使用了NSUserDefaultsDidChangeNotification

这是用来注册一个观察者代码:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(defaultsChanged:) 
              name:NSUserDefaultsDidChangeNotification 
              object:nil]; 

老答案:

它看起来并不像,如果你可以得到一个修改日期出来NSUserDefaults。到目前为止,我只能想到是这样的:

NSUserDefaults *previousDefaults = [someInstance previousUserDefaults]; 
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults]; 

if([previousDefaults isEqualToDictionary:currentDefaults]) 
{ 
    [someOtherInstance sendModifiedUserDefaultsToServerWithDefaults:currentDefaults]; 
    [yetAnotherInstance saveModified] 
} 

你有当应用程序是在第一时间推出自己的字典保存用户默认盘:您的默认值。然后,每次打开应用程序时,都会比较这两个字典。如果他们

+0

嗯。什么让我觉得有一个更好的办法是,当你改变你的iphone的网络设置时,它会自动尝试找到并连接到它。这意味着用户设置更改触发了一个操作。这对我来说也是一个很好的解决方案。他们如何做到这一点? – san 2011-04-02 21:27:04

+0

在这里你可以找到一个优雅而简单的问题解决方案。 – 2011-04-02 22:48:04

+0

哦,是啊!这很棒。但是,这会触发设置的任何更改。是否有办法只针对特定的属性更改? – san 2011-04-03 02:44:04

2

这并不是说问题太难了,只是没有一个简单的方法来做你所要求的。至少据我所知,NSUserDefaults不记录每个应用程序设置的“上次修改日期”,因此如果用户使用“设置”应用更改某些设置,那么除了查看所有的设置。

如果您真的需要这样做,我认为您最好的选择是读取您希望同步到某个数据结构并根据该结构计算某种散列或校验和的设置。将该值与您上次运行应用程序时计算的值进行比较,如果不同,请与服务器同步。如果需要,您可以将该值存储在NSUserDefaults中,但请确保您没有将其包含在计算中。

+0

谢谢Caleb.I不想让我的解决方案太复杂。我很惊讶没有必要这样的事情,并且库中没有任何东西可以支持这个想法,例如,对变化做出反应在用户设置中。 – san 2011-04-02 21:30:42

+0

通常,应用程序并不关心它的首选项是否最近发生了变化 - 无论何时需要它,它都会从默认系统中读取它们,所以如果事情发生了变化,应用程序会自动获取新值。此外,NSUserDefaults来自MacOS X,在这种情况下,用户应该能够删除应用程序的偏好文件,而不会产生任何不良影响;该应用程序应该回落到其内置的默认值。即使在iOS上,我也不会将重要信息存储在默认系统中。 – Caleb 2011-04-03 00:30:13

相关问题