Iphone 睡眠时间进入循环

Iphone 睡眠时间进入循环,iphone,objective-c,cocoa,cocoa-touch,Iphone,Objective C,Cocoa,Cocoa Touch,我需要做一个for循环,在每个循环之间等待2秒,然后继续 for (int i = 0; i < [stories count]; i++) { //my code //sleep 2 seconds and continue } for(int i=0;i

我需要做一个for循环,在每个循环之间等待2秒,然后继续

for (int i = 0; i < [stories count]; i++) {
    //my code
    //sleep 2 seconds and continue
}
for(int i=0;i<[stories count];i++){
//我的代码
//睡眠2秒钟,然后继续
}

我如何才能做到这一点?

这样做的问题是,它会在
2*[stories count]
秒的时间内阻塞用户界面,用户肯定会注意到你的应用程序没有响应,似乎挂起了。那太糟糕了

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


就这一点而言,我质疑为什么在两次操作之间需要等待两秒钟。如果您正在等待某件事情发生,您实际上应该等待,并在必要时等待更长的时间,而不是在两次操作之间硬编码固定的两秒间隔。

问题是,这将阻塞
2*[故事计数]的用户界面
秒的时间肯定足够让用户注意到你的应用程序没有响应,似乎挂起了。那太糟糕了

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


就这一点而言,我质疑为什么在两次操作之间需要等待两秒钟。如果您正在等待某件事情发生,那么您实际上应该等待,并在必要时等待更长的时间,而不是在操作之间硬编码固定的两秒间隔。

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需要几行设置,但作为奖励,它会重新使用线程,并应用其他优化以使用更少的资源。顾名思义,它还可以用于对操作进行排队。您可以指定并行操作的最大数量和不同的约束。

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需要几行设置,但作为奖励,它会重新使用线程,并应用其他优化以使用更少的资源。顾名思义,它还可以用于对操作进行排队。可以指定并行操作的最大数量和不同的约束