NSTimer timerWithTimeInterval: не работает

Я создал тестовое приложение с таймером, прежде чем внедрить его в свой проект. Это был первый раз, когда я использовал таймер. Но проблема в том, когда я реализовал таймер, используя[NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ]; , это не работает. Вот мой код, Интерфейс:

@interface uialertViewController : UIViewController
{

    NSTimer *timer;
}

-(void)displayAlert;
-(void)hideandview;
@end

Реализация:

@implementation uialertViewController
- (void)viewDidLoad {

    [self displayAlert];
    [super viewDidLoad];
}


-(void)displayAlert{

    timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(hideandview) userInfo:nil repeats:NO];

    alert = [[UIAlertView alloc] initWithTitle:@"testing" message:@"hi hi hi" delegate:nil cancelButtonTitle:@"continue" otherButtonTitles:nil];
    [alert show];




    [alert release];
    alert = nil;

}

-(void)hideandview{

    NSLog(@"triggered");

    [alert dismissWithClickedButtonIndex:0 animated:YES];

    [alert release];

    [self displayAlert];
}

@end

Then I Changed [NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ]; with [NSTimer scheduledTimerWithTimeInterval: target: selector:userInfo: repeats: ]; , It is working, В чем была проблема сtimerWithTimeInterval: ? Я что-то затуманиваю в своей первой реализации? Заранее спасибо.

 AshesToAshes01 окт. 2014 г., 21:40
Хорошо написанный вопрос поставлен с подробным кодом!
 Midhun MP15 июн. 2012 г., 23:46
@ rooster117: тогда мне нужно вызвать метод таймера огня, я прав?
 rooster11715 июн. 2012 г., 23:50
Да, или просто вызовите scheduleTimerWithTimeInterval, когда вы хотите его запустить. В любом случае
 rooster11715 июн. 2012 г., 23:43
timerWithTimeInterval создает таймер, но не запускает его, а расписание ... делает. Я думаю, что это единственная разница

Ответы на вопрос(4)

assert(Thread.isMainThread)
let timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(YourSelector), userInfo: nil, repeats: true)

timerWithTimeInterval метод возвращаетNSTimer объект, который еще не был запущен. Чтобы запустить таймер, вы должны использовать[timer fire]; С другой стороныscheduledTimerWithTimeInterval возвращаетNSTimer это уже было уволено.

Итак, в вашей первой реализации вы просто пропустили[timer fire];

 01 июл. 2012 г., 12:32
Смотрите мой пост -[timer fire] не "запускается" таймер, он просто напрямую вызывает этот метод. Вам нужно добавить таймер в цикл выполнения для его запуска.
 06 мая 2015 г., 15:49
Это работает один раз, но для непрерывного процесса используйте код Джозефа Хамфри.
 01 июл. 2012 г., 20:44
Ничего себе, я не знал об этом, OP должен принять ваш ответ.
Решение Вопроса

scheduledTimerWithTimeInterval:invocation:repeats: а такжеscheduledTimerWithTimeInterval:target:selector:userInfo:repeats: создавать таймеры, которые автоматически добавляются кNSRunLoopЭто означает, что вам не нужно добавлять их самостоятельно. Добавив их вNSRunLoop это то, что заставляет их стрелять

СtimerWithTimeInterval:invocation:repeats: а такжеtimerWithTimeInterval:target:selector:userInfo:repeats:, вы должны добавить таймер в цикл выполнения вручную, с кодом, подобным этому:

[[NSRunLoop mainRunLoop] addTimer:repeatingTimer forMode:NSDefaultRunLoopMode];

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

 27 сент. 2013 г., 19:40
Отличное объяснение! Спасибо!
 31 мар. 2014 г., 16:19
Даже при использовании запланированного метода, если он запущен в утилите командной строки, вам все равно нужно добавить его, сделайте mainRunLoop вручную, по крайней мере, по моему опыту, а также как указано:run run run nsrunloop
 04 мар. 2015 г., 08:21
scheduleTimer отлично работал с этим предложением без необходимости запуска таймера. благодарю вас
 01 нояб. 2015 г., 00:41
Я пытался использовать метод scheduleTimer без его запуска, но он не работал. Но я полностью согласен с вашим ответом, что вам не нужно добавлять его в цикл выполнения. Спасибо за разъяснение разницы.

е, но вместо того, чтобы использовать assert, поместите его в основной поток:

@objc func update() {
    ...
}

DispatchQueue.main.async {
            self.timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(self.update), userInfo: nil, repeats: true)
        }

И если асинхронность не требуется, попробуйте это:

let schedule = {
            self.timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(self.update), userInfo: nil, repeats: true)
        }

        if Thread.isMainThread {
            schedule()
        }
        else {
            DispatchQueue.main.sync {
                schedule()
            }
        }

Ваш ответ на вопрос