我寫了一個for
循環,循環遍歷一組對象。 現在我問自己是否有可能打破循環的迭代,直到用戶點擊一個按鈕,調用IBAction
?暫停for循環迭代以等待用戶輸入
for (int i = 0; i < [array count]; i++) {
// do something with the object
// wait for action method called
// user clicked action so go on
}
我寫了一個for
循環,循環遍歷一組對象。 現在我問自己是否有可能打破循環的迭代,直到用戶點擊一個按鈕,調用IBAction
?暫停for循環迭代以等待用戶輸入
for (int i = 0; i < [array count]; i++) {
// do something with the object
// wait for action method called
// user clicked action so go on
}
您可以調整代碼以適合您的情況。它基本上將循環展開成多條消息。與[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
}
蘋果NSRunLoop
概念開始序列希望你很快加工完成。如果您通過等待某些東西來綁定主線程,則應用程序中不會出現其他任何內容。上面的代碼將「等待」分解爲多個消息發送,並保持您的應用程序響應。
ODRM算法工作得很好。 我只是改變這一行:
[self performSelector:_cmd withObject:i afterDelay:0.01f];
與此:
[NSThread sleepForTimeInterval:0.25];
[NSThread detachNewThreadSelector:_cmd toTarget:self withObject:i];
作爲過來人的UI元素進行更新,這是更好地爲我們強制等待在後臺線程。
好的改進,永遠不會阻塞主線程。 – alinoz 2012-10-26 08:17:58
非常感謝你對我的幫助很大。 – 2011-04-30 17:12:30