Как запланировать несколько локальных уведомлений без зависания пользовательского интерфейса?

В моем автономном приложении PhoneGap 1.3 я использую модифицированный плагин локальных уведомлений iOS, который можно найти на официальной странице плагина GitHub.

Мне нужно запланировать повторяющееся уведомление (еженедельно/ежемесячно) или несколько одиночных уведомлений, запускаемых каждые 2 недели, в зависимости от пользовательских настроек.

Проблема возникает, когда я пытаюсь запланировать запуск этих 26 уведомлений каждые 2 недели.

В настоящее время я использую это для достижения этого:

for (int i = 1; i < 26; i++)
{
    UILocalNotification *localNotif = [[UILocalNotification alloc] init];

    if (localNotif == nil) {
        return;
    }

    NSDate *date = [[NSDate date] dateByAddingTimeInterval: i * 60 * 60 * 24 * 7 * 2];

    localNotif.fireDate = date;
    localNotif.timeZone = [NSTimeZone defaultTimeZone];
    localNotif.alertBody = [NSString stringWithFormat:@"%i: %@", i, msg];

    localNotif.hasAction = NO;
    localNotif.soundName = UILocalNotificationDefaultSoundName;
    localNotif.applicationIconBadgeNumber = 0;

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif];        

    [localNotif release];

}

При запуске этого на iPhone 3G или iPod Touch 2 пользовательский интерфейс зависает примерно на 3-5 секунд, что очень важно. Есть ли способ оптимизировать уведомления о расписании?

Я знаю, что использование только еженедельных и ежемесячных повторяющихся уведомлений решит проблему, но клиент хочет every 2 weeks, every 2 months и every 3 months уведомлений, поэтому мне нужно запланировать несколько уведомлений.

Я попытался запустить цикл в новом потоке, используя [NSThread detachNewThreadSelector:...], что вызывает новые проблемы (время от времени происходит сбой).

Являются ли iPhone, выпущенные после 3G, настолько быстрее, что задержки/зависания не будет? У меня есть только эти два древних устройства для тестирования.


person micadelli    schedule 23.05.2012    source источник


Ответы (1)


Я бы предложил либо выполнить создание в фоновом потоке, используя это: (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg

Или я бы попытался переосмыслить процесс. Возможно, вместо создания двухнедельных напоминаний на несколько лет просто создайте пару и настройте что-то еще, чтобы создать остальные. Или, может быть, даже просто создайте один и сохраните в нем повторяющийся bool, чтобы при его срабатывании он также создавал следующий.

person Ryan Poolos    schedule 23.05.2012
comment
Я уже пытался создать только один, а затем перенести другой, когда он сработает. Но проблема была в том, что это работало только тогда, когда приложение было запущено или в фоновом режиме. Im моего appDelegate didReceiveLocalNotification Я создал новое уведомление и запланировал его. Что вы имеете в виду, когда храните в нем повторяющееся логическое значение, поэтому при его срабатывании оно также создает следующее. Очень ценный пример. :) - person micadelli; 23.05.2012
comment
Я просто говорю чисто теоретически, если вы пробовали, и это не сработало, я вам верю. - person Ryan Poolos; 23.05.2012