2012-06-28 8 views
12

Я пытаюсь заставить мое приложение выполнить действие после задержки, но это нужно сделать, если пользователь взаимодействует с/прокруткой на UIScrollView.iOS: Выполнение действия после времени, когда пользователь взаимодействует/прокручивается

Я не уверен, почему ни performSelector:withObject:afterDelay, ни scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: не срабатывают. Это потому, что они на фоновом потоке?

Любые предложения или помощь?

+0

Что не работает с performSelector: afterDelay :? Что вы пытаетесь сделать? Уверены ли они, что они не срабатывают - вы отправили заявление NSLog для проверки? –

+0

Я поставил в журнал заявление. Он срабатывает после того, как пользователь перестает взаимодействовать с экраном. Я пытаюсь обновить ярлык. – RileyE

+0

Я нашел это: http://stackoverflow.com/questions/2865760/performselectorwithobjectafterdelay-not-working-from-scrollviewdidzoom, но нет никакого способа включить задержку с этим. – RileyE

ответ

23

Оба NSTimer и performSelector:withObject:afterDelay: по умолчанию имеют только огонь в обычном режиме цикла запуска. При прокрутке цикл запуска находится в режиме отслеживания событий.

Вы должны запланировать рассчитанное действие во всех распространенных режимах:

NSTimer *timer = [NSTimer timerWithTimeInterval:0.016 target:self selector:@selector(fire:) userInfo:nil repeats:YES]; 
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

или

[self performSelector:@selector(fire:) withObject:nil afterDelay:1.0 inModes:[NSArray arrayWithObject:NSRunLoopCommonModes]]; 

Там также специальный NSEventTrackingRunLoopMode.

+0

Итак, как и у меня в комментарии? – RileyE

+0

@RileyE Я не уверен, что понимаю, что вы имеете в виду. Какой комментарий? –

+0

Извините. Я очень расплывчатый! Комментарий, где я упоминаю сообщение, которое я смотрел раньше. Сообщение: http://stackoverflow.com/questions/2865760/performselectorwithobjectafterdelay-not-working-from-scrollviewdidzoom – RileyE

4

Убедитесь, что срабатывание с задержкой произошло на NSRunLoopCommonModes. Значение по умолчанию - NSDefaultRunLoopMode, которое не будет получать сообщения, например. прокрутки.

[self performSelector:@selector(fire:) withObject:nil afterDelay:2.0 inModes:@[NSRunLoopCommonModes]]; 

В качестве альтернативы вы можете использовать GCD, который также ведет себя так же, как (не уверен, какой режим runloop он использует)

double delayInSeconds = 2.0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    <#code to be executed on the main queue after delay#> 
}); 
0

Для Swift:

performSelector(#selector(fire:), withObject: sender, afterDelay: 1.0, inModes: [NSRunLoopCommonModes]) 

 Смежные вопросы

  • Нет связанных вопросов^_^