2011-03-31 5 views
1

Я пытаюсь вызвать метод в определенное время и дату (используя NSDate), но я не могу решить, как это сделать.Вызов метода в NSDate

Я не хочу использовать NSTimer, потому что это становится паузой, когда приложение переходит в фоновый режим или закрывается. Я не хочу запускать его в фоновом режиме, потому что это решает только половину проблемы и является расточительным способом сделать это, на мой взгляд. Я подумал, что если я смогу запустить метод в NSDate в будущем, когда приложение будет открыто снова, я смогу увидеть, прошла ли текущая дата даты пожара, и поэтому нужно ли сразу ее вызвать или продолжить.

Я полагаю, что я ищу что-то вроде UILocalNotification, без уведомления.

Я надеюсь, что есть простой способ сделать это, что я просто не могу найти, поэтому любая помощь будет очень признательна.

ответ

1

Сначала это звучало так, как будто вы хотите использовать метод performSelector:withObject:afterDelay:. Таким образом, у вас есть NSDate *date, когда вы хотите вызвать селектор.

NSTimeInterval delay = [date timeIntervalSinceNow]; 
[self performSelector:@selector(methodToFire) withObject:nil afterDelay:delay]; 

Конечно, это не будет жить мимо вашего времени выполнения, так что вы в значительной степени изложил то, что вам нужно сделать уже. Вы просто сохраняете свою дату где-нибудь (есть много способов сделать это), а затем проверьте ее в applicationDidBecomeActive. Вы можете использовать тот же метод timeIntervalSinceNow, который я использовал выше. (Если дата прошла, интервал был бы отрицательным.)

if ([date timeIntervalSinceNow] <= 0) { 
    // do something... 
} 
+0

Да, я думаю, это то, что я собираюсь использовать. Было любопытно надеяться, что будет 'performSelector: withObject: atDate:', но я думаю, что надеялся на то, чего там нет. :-) Любая причина использовать '[self performSelector: @selector (methodToFire) withObject: nil afterDelay: delay];' over 'NSTimer'? – Baza207

+0

Не то, о чем я могу думать, таймер - это больше кода, я думаю, но предлагает большую гибкость (что вам, вероятно, и не нужно). – livingtech

1

Почему вы не просто использовать NSTimer, а в ...

- (void)applicationDidBecomeActive:(UIApplication *)application 

обратного вызова, проверьте дату и время, и обновлять таймер, или вызов функции, если дата прошло.

+0

Я хочу, чтобы как можно больше старался держаться подальше от таймеров, чтобы поддерживать производительность до максимума. Любая причина использовать 'NSTimer' над' [self performSelector: @selector (methodToFire) withObject: nil afterDelay: delay]; '? – Baza207

+1

@ Baza207 Так что вы можете продолжать обновлять свой интерфейс, не имея дело с потоками. (Также NSTimer с низкой скоростью огня очень эффективен, Id удостоверяется, что вы профиль перед преждевременной оптимизацией.) –

+0

Ah Oki. Это помогает моему решению. Большое спасибо за вашу помощь. :-D – Baza207

Смежные вопросы