Singleton Issues in iOS http client
- by Andrew Lauer Barinov
I implemented an HTTP client is iOS that is meant to be a singleton. It is a subclass of AFNetworking's excellent AFHTTPClient
My access method is pretty standard:
+ (LBHTTPClient*) sharedHTTPClient
{
static dispatch_once_t once = 0;
static LBHTTPClient *sharedHTTPClient = nil;
dispatch_once(&once, ^{
sharedHTTPClient = [[LBHTTPClient alloc] initHTTPClient];
});
return sharedHTTPClient;
}
// my init method
- (id) initHTTPClient
{
self = [super initWithBaseURL:[NSURL URLWithString:kBaseURL]];
if (self)
{
// Sub class specific initializations
}
return self;
}
Super's init method is very long, and can be found here
However the problem I experience is when the dispatch_once queue is run, the app locks and become unresponsive.
When I step through code, I notice that it locks on dispatch_once and then remains frozen. Is this something to do with the main thread locking down? How come it stays locked like that?
Also, none of the HTTP client methods fire.
Stepping through the code some more, I find this line in dispatch/once.h is where the app locks down:
DISPATCH_INLINE DISPATCH_ALWAYS_INLINE DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
void
_dispatch_once(dispatch_once_t *predicate, dispatch_block_t block)
{
if (DISPATCH_EXPECT(*predicate, ~0l) != ~0l) {
dispatch_once(predicate, block); // App locks here
}
}