Re: NSRunLoop behavior
Re: NSRunLoop behavior
- Subject: Re: NSRunLoop behavior
- From: Rafael Cerioli <email@hidden>
- Date: Tue, 21 Sep 2010 22:30:46 -0400
Ok, thank you for your answer.
So, you are telling me that [self performSelector:@selector(waitUntilReady) withObject:nil afterDelay:1] is an input source ? What exactly is the input source, my selector or the timer that when fired, will call my selector ? I thought sources were like timers and port and stuff like that, and they were waking up the run loop, which is notifying the observers ?
Another question : say you have two sources (or observers?). The first one to be processed calls a [[NSRunLoop currentRunLoop] runUntilDate:someDate]. Will the second one be processed as the first one never exits ? Will the first one be processed recursively (no...) ?
Thank you !
Rafael
On 2010-09-21, at 9:54 AM, Keary Suska wrote:
> On Sep 21, 2010, at 5:55 AM, Rafael Cerioli wrote:
>
>> Hi,
>>
>> I'm trying to understand how run loops work. I've written this useless piece of code and I'm not sure why "success" does not show up...
>> What happens is that waitUntilReady never terminates, because it seems that the runUntilDate in myButtonAction never ends as well.
>
> Yes, as that is what your code is doing.
>
>> My theory would be that calling a runUntilDate from myButtonAction (myButtonAction is started by a run loop observer) will just prevent other sources and observers in the *current* run loop's loop (or run loop's run ??) to be processed until myButtonAction terminates.
>
> No--there is no "prevention" whatsoever. -runUntilDate: tells the current runloop *specifically* to process all input sources, and to not exit until all sources are processed *and* the specified expiration date has been reached.
>
>> So, waitUntilReady's call to runUntilDate would prevent the end of myButtonAction's current run loop's loop.
>>
>> Does someone have more info about that ?
>>
>> - (void) myButtonAction {
>> // A button event has been sent, waking up the run loop and calling that method
>>
>> // this will be called in 1 second
>> [self performSelector:@selector(waitUntilReady) withObject:nil afterDelay:1];
>
> This is an input source, so the runloop will not exit until the method exits.
>
>> // process the current run loop during 10 seconds :
>> [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:10]];
>
> Which never happens, as you never get to this line, because the method cannot exit.
>
>> [self setReady:YES];
>> }
>>
>> - (void) waitUntilReady {
>>
>> while(![self isReady]) {
>> // this should just process the run loop once :
>> [[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]];
>> }
>>
>> NSLog(@"success!");
>> }
>
> HTH,
>
> Keary Suska
> Esoteritech, Inc.
> "Demystifying technology for your home or business"
>
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden