On Feb 9, 2010, at 3:01 PM, Keith Duncan wrote:

> ...you should create a 'concurrent' NSOperation as described in the 
> documentation, and schedule your NSURLConnection on +[NSRunLoop mainRunLoop]. 
> This will allow your NSOperation -start method to exit immediately and the 
> thread to return to the pool.

I had a working async NSURLConnection scheme where I initialized the connection 
in a new thread and pumped its run loop manually on that thread until I saw the 
delegate set a completion flag. I thought I'd convert it to blocks since it 
cleans up some ugly code there. I'm 95% of the way there and things look good, 
but there are some lingering problems in my code that I don't understand. The 
above tip helped with one of my problems: the automatic block thread didn't 
pump the NSURLConnection run loop, so I scheduled the connection in the main 
run loop like Keith suggested and things worked. My first question is: doesn't 
this block the main loop with io? I have another version which uses a block to 
manually pump, but then this ties up an automatic block thread, which are 
supposed to be short-lived. Is it really a good practice to drive the 
NSURLConnection from the main loop?

My second question is: How do I memory manage the autorelease pool that the 
delegate uses? Here's a rough idea of what I have now:

    dispatch_queue_t queue = 
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        __block NSAutoreleasePool *autoReleasePool = [[NSAutoreleasePool alloc] 
init];
        NSURLConnection *connection = [NSURLConnection alloc];
        ResponseHandler *handler = [ResponseHandler alloc];
        
        [handler initWithDelegate:delegate
                  completionBlock:^{dispatch_async(queue, ^{
            [connection release];
            [handler release];
            [autoReleasePool release];
            [delegate release];            
        });}];
        
        [connection initWithRequest:urlRequest delegate:handler 
startImmediately:NO];
        [connection scheduleInRunLoop:[NSRunLoop mainRunLoop] 
forMode:NSDefaultRunLoopMode];
        [connection start];
    });

ResponseHandler is pretty simple. It processes the data and calls the 
completionBlock when done. With that code I get "attempt to pop an unknown 
autorelease pool". When I drop the release altogether the error goes away, but 
that seems like a leak.

John_______________________________________________

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