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 (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to