NSTimer, инициализированный с помощью fireDate, не запускается - PullRequest
3 голосов
/ 25 октября 2011

Я пытаюсь использовать NSTimer для вызова метода, но он не работает. Мне нужно, чтобы этот метод запускался один раз, в определенную дату и время, которые пользователь устанавливает в календаре.

У меня есть этот код в моем viewDidLoad методе:

NSDateComponents *comps = [[NSDateComponents alloc] init];

[comps setDay:24];
[comps setMonth:10];
[comps setYear:2011];

[comps setHour:23];
[comps setMinute:11];
[comps setSecond:0];


NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *date = [gregorian dateFromComponents:comps];
schedulerTimer=[[NSTimer alloc] initWithFireDate:date interval:0 target:self selector:@selector(recordByScheduler:) userInfo:nil repeats:false];

Но этот код ничего не делает. Вероятно, я неправильно понял NSCalendar. Что мне здесь делать? И второй вопрос: NSTimer запускается, когда приложение работает в фоновом режиме?

Ответы [ 3 ]

5 голосов
/ 25 октября 2011

Вам нужно запланировать таймер в цикле выполнения.

[[NSRunLoop currentRunLoop] addTimer:schedulerTimer forMode:NSDefaultRunLoopMode];

или аналогичный, в зависимости от ситуации.

Ответ на вопрос редактирования:

Нет NSTimer несрабатывает, когда ваше приложение находится в фоновом режиме.

2 голосов
/ 25 октября 2011

NSTimer не будет запускаться, если ваше приложение приостановлено в фоновом режиме.Вы можете использовать UILocalNotification в зависимости от того, что вам нужно.

0 голосов
/ 28 мая 2016

Я попробовал ответ @NJones, но он не сработал. Немного подтасовав, я обнаружил, что вы должны использовать NSRunLoopCommonModes, а не NSDefaultRunLoopMode на mainRunLoop. Например,

[[NSRunLoop mainRunLoop] addTimer:schedulerTimer forMode:NSRunLoopCommonModes];

Или Swift, который я сейчас использую:

NSRunLoop.mainRunLoop().addTimer(schedulerTimer, forMode: NSRunLoopCommonModes)

хотя, это режим, а не цикл запуска, который мешал ему работать в моем случае.

В документе говорится следующее:

NSDefaultRunLoopMode

Режим для работы с входными источниками, отличными от объектов NSConnection.

Это наиболее часто используемый режим цикла выполнения.

Доступно в iOS 2.0 и более поздних версиях.

NSRunLoopCommonModes

Объекты, добавленные в цикл выполнения с использованием этого значения в качестве режима, отслеживаются всеми режимами цикла выполнения, которые были объявлены как члены набора «общих» режимов; подробности см. В описании CFRunLoopAddCommonMode.

Доступно в iOS 2.0 и более поздних версиях.

...