我写了一个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
}
答案 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元素,因此我们最好强制等待进入后台线程。