繁体   English   中英

我如何在Objective-C中暂停/重新启动循环

[英]How can I pause/restart a loop in objective-c

想循环执行一些代码,但我想在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;
    }
}           

但是,由于某些原因,在运行此循环时将禁用所有滚动,因此我无法取消它。

我怎样才能做到这一点?

谢谢!

您说此循环在viewDidLoad中,这意味着它正在由主应用程序线程(因此是“ UI线程”)执行。如果是这种情况,您将无能为力。您的UI根本不会做任何事情该循环正在运行,因为它是执行循环的同一线程。

在不了解您在该循环中实际执行的操作的情况下,很难建议您可以采取哪些措施将工作分流到单独的线程中。

我不完全确定您在用例中的目标是-我猜您正在循环中发生某些事情,这会减慢UIScrollView的滚动速度,并使其结结超出您的期望。

我将猜测答案是使您正在使用异步的后台任务执行,以使它通常不会占用太多CPU资源。 如果您确实想在滚动视图移动时绑定到反应,那么您希望UIScrollView Delegate方法是您的主要触发点。 突出的潜在用途:

– scrollViewWillBeginDragging:
– scrollViewDidEndDragging:willDecelerate:
– scrollViewDidEndScrollingAnimation:

...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM