2011-02-09 24 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]; 
} 

它是不是真正的優雅與花哨的面向對象的回調方法等,但它得到廉價而可靠的完成工作。