Ash
Ash

Reputation: 9351

How to pause a loop to ask for input (iPhone)

I have a fairly simple looped operation that checks for obvious errors and likely problems in a data structure. I won't go into detail about it. What I want to be able to do is pause the execution of this loop whenever an error is encountered so that I can ask the user what they want to do about that error, before continuing to check the remaining data.

Can anyone give any ideas about how best to do that?

-Ash

Upvotes: 1

Views: 304

Answers (4)

hotpaw2
hotpaw2

Reputation: 70673

Don't do long operations inside a loop in the UI run loop. It presents a non-responsive UI to the user; and the OS may kill the app if it locks up for too long.

Break the loop into short callbacks (make the inside of each loop iteration a method), and exit each callback after maybe a fraction of a seconds worth of inner loop operations.

Or execute the loop as a task in a background thread, and use locks to stop the loop while waiting for messages from the foreground UI run loop about what to do for some loop state.

Upvotes: 1

bioffe
bioffe

Reputation: 6383

This will stop your loop for 0.25 seconds, but it's not what you are looking to do. You need to reformulate your question first.

CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.25, false);

Upvotes: 1

Adam
Adam

Reputation: 33126

UIAlertView is asynch, so it won't pause the loop.

There are cleverer ways to write your loop, e.g. using blocks or completion handlers, but I'd suggest the EASIEST way is simply convert your code from:

-(void) method
{
...
for( int i=0; i<10; i++)
{
check_loop_item(i);
}
}

to:

int iCurrent, iEnd;

-(void) method
{
...
iCurrent = 0;
iEnd = 10;
[self doLoop];
}

-(void) doLoop
{
if( iCurrent >= iEnd )
return;

check_loop_item(iCurrent);
...
if( error )
{
// Popup a UIAlertView
}
else
{
iCurrent++;
[self doLoop];
}

...and in the callback method from UIAlertView, do:

-(void) callbackFromUIAlertView
{
iCurrent++;
[self doLoop];
}

...i.e. a loop that runs once at a time, and lets you arbitrarily stop / pause / resume it.

Upvotes: 0

Kay
Kay

Reputation: 13146

Seems like UIAlertView is what you are looking for:

UIAlertView Class Reference

Upvotes: 0

Related Questions