Yes, this is the well-known behavior of NSURLConnection , because it needs a run loop to handle delegate events. The most common solution is to (a) create an instance using initWithRequest:delegate:startImmediately: where startImmediately is FALSE ; (b) manually scheduleInRunLoop:forMode: to schedule it in the main run loop; and then (c) start connection.
But, since you have it here, it makes no sense to direct it to the background, since it is already asynchronous, so you just need to initiate this from the main queue, and none of the above is required. You use the above template in special cases (for example, you used a subclass of NSOperation to manage your requests), but in general it is not needed.
Also, FYI, effective iOS9, NSURLConnection deprecated, so you should use NSURLSession . And NSURLSession does not suffer from this limitation.
source share