NSURLConnection already does its work asynchronously, there is no need to run 
it on a separate thread. However if you still want to, you should use 
[NSRunLoop currentRunLoop], which returns the run loop associated with that 
thread.

In your code you are not creating your objects properly. You should use the 
form [[Class alloc] init] then operate on that object:

> NSURLConnection *connection = [[NSURLConnection alloc] 
> initWithRequest:urlRequest delegate:handler startImmediately:NO];


Also I don't believe you need to create the autorelease pool. I think GCD does 
it for you.

Lastly, you should run the thread's run loop until your delegate method gets 
called indicating the NSURLConnection is done.



On Jun 20, 2010, at 1:42 PM, John Heitmann wrote:

> 
> 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/kainjow%40kainjow.com
> 
> This email sent to kain...@kainjow.com

_______________________________________________

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