In case you were wondering why the delegate methods don't get called while your connection is in the background: If you put the connection in a background queue, it gets shoved away after the queue is complete, and thus you don't get your delegate callbacks. The connection has to be in the main queue so it stays in the run loop for callbacks to occur. Or, in your case, create it's own run loop.
If you don't want to deal with runloops, all you have to do is put the connection on the main queue:
dispatch_async(dispatch_get_main_queue(), ^(void){
conn = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:NO];
[conn start];
}
Then you should get your delegate callbacks.