2011-04-30 80 views
0

我寫了一個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 
} 

回答

3

您可以調整代碼以適合您的情況。它基本上將循環展開成多條消息。與[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概念開始序列希望你很快加工完成。如果您通過等待某些東西來綁定主線程,則應用程序中不會出現其他任何內容。上面的代碼將「等待」分解爲多個消息發送,並保持您的應用程序響應。

+0

非常感謝你對我的幫助很大。 – 2011-04-30 17:12:30

1

ODRM算法工作得很好。 我只是改變這一行:

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

與此:

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

作爲過來人的UI元素進行更新,這是更好地爲我們強制等待在後臺線程。

+0

好的改進,永遠不會阻塞主線程。 – alinoz 2012-10-26 08:17:58