检测已更改的用户默认值

时间:2011-02-09 19:13:04

标签: iphone cocoa-touch

我有一个iPhone应用程序并已实现本地通知。该应用在“设置”中有一个页面,允许用户在事件发生前的指定天数内安排通知。为确保每次用户激活应用程序时对设置的更改生效,我的应用程序委托中都有以下内容:

- (void)applicationDidBecomeActive:(UIApplication *)application {
    [[NSUserDefaults standardUserDefaults] synchronize];
    [self rescheduleAllNotificationsWithUserNotification:NO];
}

问题是对rescheduleAllNotificationsWithUserNotification:的调用需要几秒钟,而应用程序在启动时感觉有些迟钝。

如果任何设置已更改,我只需要致电rescheduleAllNotificationsWithUserNotification:有没有办法检测用户是否更改了应用激活之间的任何设置,以便我可以避免始终重新安排通知

3 个答案:

答案 0 :(得分:2)

我认为您可能正在寻找NSUserDefaultsDidChangeNotification通知。

您可以注册以收听此通知,并在用户的偏好发生变化时收到通知。

答案 1 :(得分:1)

您应该使用一种方法将此方法调用放在另一个线程中。 performSelectorInBackground是一种简单的方法:

[self performSelectorInBackground:@selector(rescheduleAllNotificationsWithUserNotification:) withObject:NO];

这应该可以帮助你摆脱迟滞的表现。您甚至可以使用^块,因为您似乎在iOS 4上。

答案 2 :(得分:0)

我过去所做的,如果没有太多的首选项值要监控,就是有备用版本,有点像“我上次运行”版本。可以通过“设置”应用程序访问一组值,但只能从应用程序中设置另一组值。

NSString *name = (NSString *) CFPreferencesCopyAppValue( (CFStringRef) @"name_preference", kCFPreferencesCurrentApplication );
NSString *nameLastTime = (NSString *) CFPreferencesCopyAppValue( (CFStringRef) @"name_last_execution", kCFPreferencesCurrentApplication );
// Need obvious checks for empty or missing entries, etc., etc.
if( ![nameLastTime isEqual: name] ) {
    // Store the new name as the name at last execution...
    CFPreferencesSetAppValue( (CFStringRef) @"name_last_execution", (CFStringRef) name, kCFPreferencesCurrentApplication );
    CFPreferencesAppSynchronize( kCFPreferencesCurrentApplication );
    [self rescheduleAllNotificationsWithUserNotification:NO];
}

使用花哨的面向对象的回调方法等并不是真正的优雅,但它可以廉价而可靠地完成工作。