Skip navigation.
 
mlRe: runloops and NSURLConnection
FROM : Jean-Daniel Dupas
DATE : Sat May 31 19:58:01 2008

Le 31 mai 08 à 19:14, Torsten Curdt a écrit :

> On May 31, 2008, at 18:55, Jens Alfke wrote:

>> On 31 May '08, at 8:07 AM, Torsten Curdt wrote:
>>

>>>> I think you want to schedule the connection for the 
>>>> NSModalPanelRunLoopMode runloop mode.  This is the mode that is 
>>>> used for modal windows.

>>>
>>> You mean with scheduleInRunLoop:forMode: ? ...but that's only 
>>> available since 10.5

>>
>> I don't know of a good alternative that's 10.4-compatible, short of 
>> running the NSURLConnection on a background thread with its own 
>> runloop.

>
> OK ..so at least it was a real shortcoming and not me fighting the 
> framework again.
>
> What about my current solution with the run loop? Does it smell 
> really bad ...or is the workaround OK as well?
>

>> But have you considered _not_ using a modal panel? IMHO, modal 
>> panels are a "UI smell", to coin a phrase. Does it really need to 
>> be impossible for the user to interact in any other way with the 
>> app while that panel is open? Usually a sheet will suffice, and 
>> sheets don't use a special runloop mode, so that would solve your 
>> problem.

>
> Indeed - modal is smelly  ...and I have considered non-modal. It 
> would make my life easier. But since I have just integrated your 
> exception handling into the FeedbackReporter framework ...wouldn't 
> you expect the dialog that pops up in case of an uncaught exception 
> to be modal?
>
> cheers
> --
> Torsten


If you handle the modal session yourself, it's easy to let the 
connection do some processing while the modal window is open:
Replace -[NSApp runModalForWindow:[self window]] by this and it should 
do the trick.

    /* Create a modal session, and in each loop,
    we process the default runloop event sources (url download, 
network connections, etc.) */
    NSModalSession session = [NSApp beginModalSessionForWindow:[self 
window]];
    for (;;) {
      if ((result = [NSApp runModalSession:session]) != 
NSRunContinuesResponse)
        break;
      /* Note: Do not use a 0 timeout, else this loop will never 
block and will consume a lots of CPU.
        In fact, the Cocoa UI event port is scheduled in the default 
runloop, so each Cocoa event will wakeup the runloop. */
      [[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]];
    }
    [NSApp endModalSession:session];

Related mailsAuthorDate
mlrunloops and NSURLConnection Torsten Curdt May 31, 15:28
mlRe: runloops and NSURLConnection Michael Vannorsdel May 31, 16:09
mlRe: runloops and NSURLConnection Torsten Curdt May 31, 17:07
mlRe: runloops and NSURLConnection Jens Alfke May 31, 18:55
mlRe: runloops and NSURLConnection Michael Vannorsdel May 31, 19:03
mlRe: runloops and NSURLConnection Torsten Curdt May 31, 19:14
mlRe: runloops and NSURLConnection Jens Alfke May 31, 19:54
mlRe: runloops and NSURLConnection Jean-Daniel Dupas May 31, 19:58
mlRe: runloops and NSURLConnection Torsten Curdt Jun 1, 14:27
mlRe: runloops and NSURLConnection Torsten Curdt Jun 1, 14:28
mlRe: runloops and NSURLConnection Jean-Daniel Dupas Jun 1, 18:18