2011-02-09 89 views
1

我有一个iPhone应用程序并已实施本地通知。该应用在“设置”中有一个页面,允许用户在事件发生前的指定天数内安排通知。为了确保更改的设置生效每次用户启动应用程序时,我有我的应用程序委托以下:检测到更改的用户默认设置

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

的问题是,在调用rescheduleAllNotificationsWithUserNotification:需要几秒钟,应用感觉一开始有点呆滞。

如果任何设置已更改,我只需要拨打rescheduleAllNotificationsWithUserNotification:即可。 有没有办法检测用户是否更改了应用程序激活之间的任何设置,这样我就可以避免总是重新安排通知

回答

1

你应该用一种方法把这个方法调用放在另一个线程中是可能的。 performSelectorInBackground是一个简单的方法来做到这一点:

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

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

+0

好主意,把它放在后台线程中,当我调用这个方法时,我绝对应该在所有情况下做这件事。但是,如果自上次激活应用程序后设置保持不变,我仍然在寻找一种方法来避免来电。 – 2011-02-09 19:30:56

2

我想你可能正在寻找NSUserDefaultsDidChangeNotification通知。

您可以注册以收听此通知,并在用户的偏好更改时收到通知。

+0

这在跨应用程序重新启动时不起作用。也就是说,应用程序正在运行,然后用户重新启动手机。用户在重新启动后更改通知设置,然后重新启动应用程序。如果应用没有运行,那么它不会收到通知。 – 2011-02-17 22:50:24

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]; 
} 

它是不是真正的优雅与花哨的面向对象的回调方法等,但它得到廉价而可靠的完成工作。