睡觉时间进入循环

时间:2009-08-27 16:12:52

标签: iphone objective-c cocoa cocoa-touch

我需要进行for循环,并在每个循环之间等待2秒并继续

for (int i = 0; i < [stories count]; i++) {
    //my code
    //sleep 2 seconds and continue
}

我该怎么做?

3 个答案:

答案 0 :(得分:8)

[NSThread sleepForTimeInterval:2.0];

答案 1 :(得分:2)

Peter Hosey关于阻止UI线程是正确的,通常称为主线程。但我认为他的解决方案很复杂。

简单解决方案1:使用以下方法调用长阻塞循环在后台线程上的方法:

[self performSelectorInBackground:@selector(longRunningMethod)
                       withObject:nil];

简单解决方案2:将长阻塞循环的方法添加到NSOperationsQueue:

NSOperationQueue* oq = [[NSOperationQueue new] autorelease];
NSOperation* o = [[NSInvocationOperation alloc] initWithTarget:self
                                                      selector:@selector(longRunningMethod)
                                                        object:nil]
[oq addOperation:o];
[o release];

在背景中点击选择器更容易,几乎太容易了,因为如果习惯用它们会耗尽资源。

使用NSOperationQueue需要几行设置,但作为奖励,它会重新使用线程,并应用其他优化来使用更少的资源。顾名思义,它也可以用于排队操作。您可以指定最大并行操作数和不同约束。

答案 2 :(得分:1)

这个问题是它会阻止2 * [stories count]秒的用户界面 - 当然足够让用户注意到你的应用没有响应并且似乎挂起了。那很糟糕。

改为使用计时器,并在计时器[stores objectEnumerator]中保留索引(如果确实需要索引)或NSEnumerator(userInfo)。实现您的计时器回调方法以处理一个对象。如果您正在使用索引,则该方法还应将userInfo中的索引替换为下一个索引。它的最后一步是检查你的项目是否已用完,如果是,则调用你失效的方法并释放计时器(你也应该从dealloc调用)。

就此而言,我怀疑为什么你需要在两次操作之间等待两秒钟。如果您正在等待某些事情发生,您应该等待它,并在必要时等待更长时间,而不是在操作之间硬编码固定的两秒间隔。