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

Iphone 如何在objective-c中暂停/重新启动循环,iphone,objective-c,loops,scroll,uiscrollview,Iphone,Objective C,Loops,Scroll,Uiscrollview,希望在循环中执行一些代码,但我希望在uiscrollview滚动时暂停它 我创建了一个名为isScrolling的BOOL,在scrollViewDidScroll方法中设置为“是”,在ScrollViewDidEndDecelling方法中设置为“否” 我想把循环放在ScrollViewDiEndDecelling方法中,但是当isScrolling==YES时它会暂停,然后在isScrolling==NO时重新启动它 我在一个数组中循环,所以我想让循环在数组中结束的地方继续 例如,这里有一个

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

我创建了一个名为isScrolling的BOOL,在scrollViewDidScroll方法中设置为“是”,在ScrollViewDidEndDecelling方法中设置为“否”

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

我在一个数组中循环,所以我想让循环在数组中结束的地方继续

例如,这里有一个简单的循环,它以1的增量不断递增,我将其放置在ViewDidAspect方法中:

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

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

    if (isScrolling == YES) {
        NSLog(@"break");
        break;
    }
}           
但是,由于某种原因,当这个循环运行时,所有的滚动都被禁用,所以我不能取消它

我该怎么做


谢谢

我不完全确定您在这个用例中的目标是什么-我猜您在一个循环中发生了一些事情,这会减慢您的UIScrollView滚动,并使其比您希望的更为断断续续

我猜答案是,让您正在处理的后台任务异步化,这样总体上不会占用太多CPU资源。如果您真的想在滚动视图移动时做出反应,那么您希望这些方法成为您的主要触发点。突出的潜在用途包括:

– scrollViewWillBeginDragging:
– scrollViewDidEndDragging:willDecelerate:
– scrollViewDidEndScrollingAnimation:


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

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


如果不了解更多关于您在该循环中实际执行的操作,则很难建议您如何将该工作卸载到单独的线程中。

您是正确的,因为我正在尝试运行一种会导致tableView性能问题的方法。不幸的是,我使用的图像和UIView不是真实的d-safe,因此我无法在后台线程上异步加载它们。不幸的是,您建议的方法似乎不起作用,因为在循环运行时,所有滚动和触摸似乎都被禁用。有关更多说明,请参阅我修订的问题。感谢帮助!我正在将一组图像添加到一些子视图中,以便快速查看它们y稍后。不幸的是,UIView和图像不是线程安全的。我已经尝试使用Grand Central Dispatch,它通常是有效的,但由于非线程安全的元素,它会导致不稳定。这可能是错误的,因为我从未尝试过。我想知道您是否可以在单独的t中构建这些不同的UIView/UIImageView我知道这在Windows中通常不是一个好主意,但不知道UIView在iOS的奇妙世界中是否有某种内部线程亲缘关系。这是值得的-如果你的循环在viewDidLoad中,那么负责所有视觉动画和用户交互的主UI线程将被完全阻止。