Подтвердить что ты не робот

Таймер NSTimerWithTimeInterval: не работает

Я создал тестовое приложение с таймером перед его внедрением в свой проект. Это был первый раз, когда я использую таймер. Но проблема в том, что когда я использовал таймер, используя [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

Затем я изменил [NSTimer timerWithTimeInterval: target: selector: userInfo: repeats: ]; с помощью [NSTimer scheduledTimerWithTimeInterval: target: selector:userInfo: repeats: ]; , он работает. В чем проблема с timerWithTimeInterval:? Я что-то вижу в своей первой реализации? Спасибо заранее.

4b9b3361

Ответ 1

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 самостоятельно. У вас нет - он будет вызываться, как только таймер будет помещен в цикл выполнения.

Ответ 2

Также вы можете захотеть добавить таймер в основной поток.

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

Ответ 3

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

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