2011-07-13 57 views
6

可能重复:
UIScrollView pauses NSTimer until scrolling finishes为什么计时器在UIWebView iPhone中滚动时停止?

我有一点麻烦搞清楚为什么的NSTimer,只要我在UIWebView的滚动停止。请看看下面的代码(我知道这是不是一门功课的网站,但老实说,我是被卡住):

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSString *address = @"http://en.m.wikipedia.org/wiki/"; 
    NSURL *url = [NSURL URLWithString:address]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    [wiki loadRequest:request]; 
    time = 0; 
    countValue = 0; 
    timer = [NSTimer scheduledTimerWithTimeInterval: 0.1 target: self selector: @selector(updateTimer) userInfo: nil repeats: YES]; 
    timeRand = 0; 
    countValueRand = 1; 
    randomTimer = [NSTimer scheduledTimerWithTimeInterval: 0.1 target: self selector: @selector(updateRandomTimer) userInfo: nil repeats: YES]; 
    [self generateWordsArray]; 
} 
+1

没有什么问题在这里,怎么看你的' - (无效)updateTimer'和' - (无效)updateRandomTimer'?可能在那里停止你的计时器?你确定滚动停止计时器吗? – 2011-07-13 18:55:48

+1

停止或延迟? –

+0

嗨,非常感谢您的帮助,但是我确信webview确实会停止计时器的运行... – dyang

回答

28

你必须计时器添加到另一个RunLoopMode。默认情况下,定时器被添加到NSDefaultRunLoopMode。这意味着定时器只在应用程序的运行循环处于NSDefaultRunLoopMode时执行。

现在,当用户触摸屏幕(例如滚动一个UIScrollView)运行循环的模式将被切换到NSEventTrackingRunLoopMode。而现在,运行循环不再处于NSDefaultRunMode中,定时器将不会执行。这种丑陋的效果是,只要用户触摸屏幕,该计时器就会被阻止。这可能是用户滚动的时间,因为定时器被阻塞直到滚动完全停止。而当用户继续滚动时,定时器再次被阻止。

幸运的是解决这个问题很简单:您可以将计时器添加到另一个NSRunLoopMode。当将定时器添加到NSRunLoopCommonModes时,它将在所有运行循环模式下执行(已被声明为“常见”模式集合中的一员)。这意味着计时器不仅在NSDefaultRunLoopMode中工作,而且在NSEventTrackingRunLoopMode中(当用户触摸屏幕时)。

等你以后初始化计时器,将它添加到NSRunLoopCommonModes:

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
+5

你,我的朋友,真棒! – dyang

+0

我的朋友也是! –

1

好用户交互块主线程因此定时器被延迟,因为它增加了自己当前线程的运行循环。

如果你想在不考虑用户交互的所谓定时器,你应该考虑产生一个新的线程,连接定时器线程。

你也可以看GCD based timerMike Ash它将在后台运行。你应该记住的唯一事情是UI更新必须在主线程上完成。

+0

非常感谢您的帮助! – dyang