暂停for循环的迭代以等待用户输入

时间:2011-04-30 17:00:18

标签: objective-c cocoa-touch for-loop control-flow

我写了一个for循环,它遍历一个对象数组。 现在我问自己是否有可能打破循环的迭代,直到用户点击一个调用IBAction的按钮?

for (int i = 0; i < [array count]; i++) {
   // do something with the object

   // wait for action method called
   // user clicked action so go on
}

2 个答案:

答案 0 :(得分:4)

您可以调整代码以适合您的情况。它基本上将循环“展开”为多个消息。使用[self doItForIndex:[NSNumber numberWithInt:0]];

开始序列
- (BOOL)canDoitForIndex:(NSNumber *)i {
    // return YES if you want to go ahead
    // (e.g. test a BOOL you set in response to the user tapping a button
}

- (void)waitForIndex:(NSNumber *)i {
    if ([self canDoItForIndex:i]) {
        // do anything to clean up for i
        // then repeat for i+1:
        [self doItForIndex:[NSNumber numberWithInt:[i intValue]+1]];
    } else {
        [self performSelector:_cmd withObject:i afterDelay:0.01f;
    }
}

- (void)doItForIndex:(NSNumber *)i {
    if ([i intValue] < lastIndex) {
        // do what you have to do
        [self waitForIndex:i];
    }
    // else you're done
}

Apple的NSRunLoop概念希望您能够快速完成处理。如果你通过等待某事来占用主线程,那么你的应用程序中就不会发生任何其他事情。上面的代码将“等待”分解为多个消息发送,并使您的应用程序保持响应。

答案 1 :(得分:1)

ODRM算法非常有效。 我只是更改了这一行:

[self performSelector:_cmd withObject:i afterDelay:0.01f];

用这个:

   [NSThread sleepForTimeInterval:0.25];  
   [NSThread detachNewThreadSelector:_cmd toTarget:self withObject:i];

由于我要更新UI元素,因此我们最好强制等待进入后台线程。