Avoid dispatching network callbacks when already on the right queue
Reviewed By: mmmulani Differential Revision: D3690133 fbshipit-source-id: a1769016a05b3163a3b1c93f448864aeaecc6e46
This commit is contained in:
parent
66bea7d1e5
commit
0b1954cace
|
@ -9,6 +9,8 @@
|
|||
|
||||
#import "RCTHTTPRequestHandler.h"
|
||||
|
||||
#import "RCTNetworking.h"
|
||||
|
||||
@interface RCTHTTPRequestHandler () <NSURLSessionDataDelegate>
|
||||
|
||||
@end
|
||||
|
@ -19,6 +21,8 @@
|
|||
NSURLSession *_session;
|
||||
}
|
||||
|
||||
@synthesize bridge = _bridge;
|
||||
|
||||
RCT_EXPORT_MODULE()
|
||||
|
||||
- (void)invalidate
|
||||
|
@ -55,6 +59,7 @@ RCT_EXPORT_MODULE()
|
|||
|
||||
NSOperationQueue *callbackQueue = [NSOperationQueue new];
|
||||
callbackQueue.maxConcurrentOperationCount = 1;
|
||||
callbackQueue.underlyingQueue = [[_bridge networking] methodQueue];
|
||||
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
|
||||
_session = [NSURLSession sessionWithConfiguration:configuration
|
||||
delegate:self
|
||||
|
|
|
@ -37,6 +37,8 @@
|
|||
_handler = handler;
|
||||
_callbackQueue = callbackQueue;
|
||||
_status = RCTNetworkTaskPending;
|
||||
|
||||
dispatch_queue_set_specific(callbackQueue, (__bridge void *)self, (__bridge void *)self, NULL);
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
@ -53,6 +55,15 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init)
|
|||
_uploadProgressBlock = nil;
|
||||
}
|
||||
|
||||
- (void)dispatchCallback:(dispatch_block_t)callback
|
||||
{
|
||||
if (dispatch_get_specific((__bridge void *)self) == (__bridge void *)self) {
|
||||
callback();
|
||||
} else {
|
||||
dispatch_async(_callbackQueue, callback);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)start
|
||||
{
|
||||
if (_requestToken == nil) {
|
||||
|
@ -96,9 +107,9 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init)
|
|||
_status = RCTNetworkTaskFinished;
|
||||
if (_completionBlock) {
|
||||
RCTURLRequestCompletionBlock completionBlock = _completionBlock;
|
||||
dispatch_async(_callbackQueue, ^{
|
||||
[self dispatchCallback:^{
|
||||
completionBlock(self->_response, nil, RCTErrorWithMessage(@"Invalid request token."));
|
||||
});
|
||||
}];
|
||||
}
|
||||
[self invalidate];
|
||||
}
|
||||
|
@ -114,9 +125,9 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init)
|
|||
if (_uploadProgressBlock) {
|
||||
RCTURLRequestProgressBlock uploadProgressBlock = _uploadProgressBlock;
|
||||
int64_t length = _request.HTTPBody.length;
|
||||
dispatch_async(_callbackQueue, ^{
|
||||
[self dispatchCallback:^{
|
||||
uploadProgressBlock(bytesSent, length);
|
||||
});
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -129,9 +140,9 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init)
|
|||
_response = response;
|
||||
if (_responseBlock) {
|
||||
RCTURLRequestResponseBlock responseBlock = _responseBlock;
|
||||
dispatch_async(_callbackQueue, ^{
|
||||
[self dispatchCallback:^{
|
||||
responseBlock(response);
|
||||
});
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -151,15 +162,15 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init)
|
|||
|
||||
if (_incrementalDataBlock) {
|
||||
RCTURLRequestIncrementalDataBlock incrementalDataBlock = _incrementalDataBlock;
|
||||
dispatch_async(_callbackQueue, ^{
|
||||
[self dispatchCallback:^{
|
||||
incrementalDataBlock(data, length, total);
|
||||
});
|
||||
}];
|
||||
}
|
||||
if (_downloadProgressBlock && total > 0) {
|
||||
RCTURLRequestProgressBlock downloadProgressBlock = _downloadProgressBlock;
|
||||
dispatch_async(_callbackQueue, ^{
|
||||
[self dispatchCallback:^{
|
||||
downloadProgressBlock(length, total);
|
||||
});
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -172,9 +183,9 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init)
|
|||
_status = RCTNetworkTaskFinished;
|
||||
if (_completionBlock) {
|
||||
RCTURLRequestCompletionBlock completionBlock = _completionBlock;
|
||||
dispatch_async(_callbackQueue, ^{
|
||||
[self dispatchCallback:^{
|
||||
completionBlock(self->_response, self->_data, error);
|
||||
});
|
||||
}];
|
||||
}
|
||||
[self invalidate];
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue