Попытка рекурсивного вызова функции, но она повторяется намного быстрее, чем 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 это не секунды, а миллисекунды