如何在objective-c中暂停/重新启动循环

时间:2010-08-22 17:58:42

标签: iphone objective-c loops scroll uiscrollview

想在循环中执行一些代码,但我想在uiscrollview滚动时暂停它。

我创建了一个名为isScrolling的BOOL,在scrollViewDidScroll方法中设置为“YES”,并在scrollViewDidEndDecelerating方法中设置为“NO”。

我想将循环放在scrollViewDidEndDecelerating方法中,但是当isScrolling == YES时暂停它,然后在isScrolling == NO时重新启动它。

我正在循环一个数组,所以我想让循环从数组中取出它所在的位置。

例如,这是一个简单的循环,它通过我放在viewDidAppear方法中的增量1连续计数:

for (int i = 1; i > 0; i++) {

    NSLog(@"i = %d", i);

    if (isScrolling == YES) {
        NSLog(@"break");
        break;
    }
}           

但是,当这个循环由于某种原因而运行时,所有滚动都被禁用,所以我无法取消它。

我该怎么做?

谢谢!

2 个答案:

答案 0 :(得分:2)

你说这个循环在viewDidLoad中,这意味着它正在由主应用程序线程(以及“UI线程”)执行。如果是这样的话,那么你无能为力。你的用户界面不会做该循环正在运行时所有的东西都在运行,因为它是执行循环的同一个线程。

如果不了解你在这个循环中实际做了什么,那么很难建议你可以做些什么来将这项工作卸载到一个单独的线程中。

答案 1 :(得分:0)

我不完全确定你在这个用例中的目标是什么 - 我猜你在循环中发生了一些事情,这会减慢你的UIScrollView滚动速度并使它比你更加口吃等。

我猜测答案是让你正在使用的后台任务是异步的,这样它就不会占用太多的CPU资源。如果你真的想在滚动视图移动时绑定到响应,那么你希望UIScrollView Delegate方法成为你的主要触发点。那些脱颖而出的潜在用途:

– scrollViewWillBeginDragging:
– scrollViewDidEndDragging:willDecelerate:
– scrollViewDidEndScrollingAnimation:

...

不要在viewDidLoad中调用循环,否则您将阻止主UI交互线程。相反,使用经典线程或更好的NSOperationQueue触发后台进程,以执行您想要完成的任何循环/后台操作。如果在视图控制器中有该队列引用,当一个人决定使用上面的委托方法滚动时,您也可以挂钩以暂停或取消这些操作。