diff --git a/Libraries/Image/RCTImageDownloader.m b/Libraries/Image/RCTImageDownloader.m index 59f1a9ada..115fc10f4 100644 --- a/Libraries/Image/RCTImageDownloader.m +++ b/Libraries/Image/RCTImageDownloader.m @@ -96,6 +96,7 @@ RCT_EXPORT_MODULE() if (progressBlock) { task.downloadProgressBlock = progressBlock; } + [task start]; return ^{ [task cancel]; }; } diff --git a/Libraries/Network/RCTDownloadTask.h b/Libraries/Network/RCTDownloadTask.h index a6151a4d0..2cb2a8f0b 100644 --- a/Libraries/Network/RCTDownloadTask.h +++ b/Libraries/Network/RCTDownloadTask.h @@ -35,6 +35,7 @@ typedef void (^RCTURLRequestResponseBlock)(NSURLResponse *response); handler:(id)handler completionBlock:(RCTURLRequestCompletionBlock)completionBlock NS_DESIGNATED_INITIALIZER; +- (void)start; - (void)cancel; @end diff --git a/Libraries/Network/RCTDownloadTask.m b/Libraries/Network/RCTDownloadTask.m index a70c64113..a0492d542 100644 --- a/Libraries/Network/RCTDownloadTask.m +++ b/Libraries/Network/RCTDownloadTask.m @@ -29,18 +29,16 @@ static NSUInteger requestID = 0; if ((self = [super init])) { - if (!(_requestToken = [handler sendRequest:request withDelegate:self])) { - return nil; - } _requestID = @(requestID++); _request = request; _handler = handler; _completionBlock = completionBlock; - _selfReference = self; } return self; } +RCT_NOT_IMPLEMENTED(- (instancetype)init) + - (void)invalidate { _selfReference = nil; @@ -51,7 +49,15 @@ _uploadProgressBlock = nil; } -RCT_NOT_IMPLEMENTED(- (instancetype)init) +- (void)start +{ + if (_requestToken == nil) { + if ([self validateRequestToken:[_handler sendRequest:_request + withDelegate:self]]) { + _selfReference = self; + } + } +} - (void)cancel { @@ -63,6 +69,12 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init) - (BOOL)validateRequestToken:(id)requestToken { + if (_requestToken == nil) { + if (requestToken == nil) { + return NO; + } + _requestToken = requestToken; + } if (![requestToken isEqual:_requestToken]) { if (RCT_DEBUG) { RCTLogError(@"Unrecognized request token: %@ expected: %@", requestToken, _requestToken); diff --git a/Libraries/Network/RCTNetworking.m b/Libraries/Network/RCTNetworking.m index 7c3a83bb1..73f9dc57c 100644 --- a/Libraries/Network/RCTNetworking.m +++ b/Libraries/Network/RCTNetworking.m @@ -238,6 +238,8 @@ RCT_EXPORT_MODULE() cancellationBlock = callback(error, data ? @{@"body": data, @"contentType": RCTNullIfNil(response.MIMEType)} : nil); }]; + [task start]; + __weak RCTDownloadTask *weakTask = task; return ^{ [weakTask cancel]; @@ -362,6 +364,8 @@ RCT_EXPORT_MODULE() _tasksByRequestID[task.requestID] = task; responseSender(@[task.requestID]); } + + [task start]; } #pragma mark - Public API