我需要进行for循环,并在每个循环之间等待2秒并继续
for (int i = 0; i < [stories count]; i++) {
//my code
//sleep 2 seconds and continue
}
我该怎么做?
答案 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
调用)。
就此而言,我怀疑为什么你需要在两次操作之间等待两秒钟。如果您正在等待某些事情发生,您应该等待它,并在必要时等待更长时间,而不是在操作之间硬编码固定的两秒间隔。