我有一个iPhone应用程序并已实现本地通知。该应用在“设置”中有一个页面,允许用户在事件发生前的指定天数内安排通知。为确保每次用户激活应用程序时对设置的更改生效,我的应用程序委托中都有以下内容:
- (void)applicationDidBecomeActive:(UIApplication *)application {
[[NSUserDefaults standardUserDefaults] synchronize];
[self rescheduleAllNotificationsWithUserNotification:NO];
}
问题是对rescheduleAllNotificationsWithUserNotification:
的调用需要几秒钟,而应用程序在启动时感觉有些迟钝。
如果任何设置已更改,我只需要致电rescheduleAllNotificationsWithUserNotification:
。 有没有办法检测用户是否更改了应用激活之间的任何设置,以便我可以避免始终重新安排通知?
答案 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];
}
使用花哨的面向对象的回调方法等并不是真正的优雅,但它可以廉价而可靠地完成工作。