Попытка рекурсивного вызова функции, но она повторяется намного быстрее, чем 1-секундная задержка в коде

У меня есть функция, которая должна вызываться каждые 1 секунду. Я пытаюсь просто вызвать его в конце функции или вызвать отдельную функцию, которая затем вызывает исходную функцию через одну секунду. Обе попытки терпят неудачу - NSLog показывает, что функция вызывается намного быстрее, чем каждую 1 секунду.

Первый способ:

- (void) startPlacingUser
{
NSString *bigMLLocation = [self predictLocationWith:locationRSSiValues];
[self performSelector: @selector(startPlacingUser) withObject:nil afterDelay: 1];
}

Этот просто вызывает себя каждые 0,3 секунды или около того, и время не согласовано - иногда быстрее, иногда медленнее. Функция предиката - это большой оператор if, который просто возвращает строку.

Второй метод:

- (void) startPlacingUser
{
NSString *bigMLLocation = [self predictLocationWith:locationRSSiValues];
[self placeUserAgain];
}

-(void) placeUserAgain
{
[NSThread sleepForTimeInterval:1];
[self startPlacingUser];
}

Этот метод вызывает startPlacingUser примерно 100 раз в секунду.

Оба из них дают сумасшедшее время для вызова startPlacingUser, и это определенно не каждую 1 секунду.

2 ответа

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

...
    NSTimer* myTimer = [NSTimer scheduledTimerWithTimeInterval: 1.0 target: self
                                   selector: @selector(startPlacingUser:) userInfo: nil repeats: YES];
...
...
-(void) startPlacingUser:(NSTimer*) t 
{
    NSString *bigMLLocation = [self predictLocationWith:locationRSSiValues];
}

Ваше текущее решение не будет работать точно и может вызвать переполнение стека.

Измените sleepForTimeInterval на 1000 это не секунды, а миллисекунды

Другие вопросы по тегам