如何在不冻结UI的情况下安排多个本地通知?

时间:2012-05-23 11:52:22

标签: iphone ios cordova uilocalnotification phonegap-plugins

在我的PhoneGap 1.3离线应用程序中,我正在使用官方插件GitHub页面中的修改后的iOS本地通知插件。

我需要根据用户定义的设置安排重复通知(每周/每月)或每两周发出多个单一通知。

当我尝试安排每两周发布一次26个通知时,会出现问题。

目前我正在使用它来实现这一目标:

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 weeksevery 2 monthsevery 3 months通知,因此我需要安排多个通知。< / p>

我试图使用[NSThread detachNewThreadSelector:...]在新线程中运行循环,这会引发新问题(偶尔会崩溃)。

在3G之后发布iPhone的速度要快得多,延迟/冻结将不存在吗?我只有那两个古老的设备来测试。

1 个答案:

答案 0 :(得分:1)

我建议使用以下代码在后台线程中执行创建:(void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg

或者我会尝试重新考虑这个过程。也许不是一次创建一个价值2周的提醒,而是创建一对夫妇并设置其他东西以创建其余部分。或者甚至可以创建一个并存储重复的bool,因此当它触发时它也会创建下一个。