diff --git a/packages/react-native/Libraries/Network/RCTDataRequestHandler.mm b/packages/react-native/Libraries/Network/RCTDataRequestHandler.mm index 2aff977cf65..d5793870f55 100644 --- a/packages/react-native/Libraries/Network/RCTDataRequestHandler.mm +++ b/packages/react-native/Libraries/Network/RCTDataRequestHandler.mm @@ -49,8 +49,13 @@ RCT_EXPORT_MODULE() _queue.maxConcurrentOperationCount = 2; } - __weak __block NSBlockOperation *weakOp; - __block NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{ + __weak NSBlockOperation *weakOp; + NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{ + NSBlockOperation *strongOp = weakOp; // Strong reference to avoid deallocation during execution + if (strongOp == nil || [strongOp isCancelled]) { + return; + } + // Get mime type NSRange firstSemicolon = [request.URL.resourceSpecifier rangeOfString:@";"]; NSString *mimeType = @@ -62,15 +67,15 @@ RCT_EXPORT_MODULE() expectedContentLength:-1 textEncodingName:nil]; - [delegate URLRequest:weakOp didReceiveResponse:response]; + [delegate URLRequest:strongOp didReceiveResponse:response]; // Load data NSError *error; NSData *data = [NSData dataWithContentsOfURL:request.URL options:NSDataReadingMappedIfSafe error:&error]; if (data) { - [delegate URLRequest:weakOp didReceiveData:data]; + [delegate URLRequest:strongOp didReceiveData:data]; } - [delegate URLRequest:weakOp didCompleteWithError:error]; + [delegate URLRequest:strongOp didCompleteWithError:error]; }]; weakOp = op; diff --git a/packages/react-native/Libraries/Network/RCTFileRequestHandler.mm b/packages/react-native/Libraries/Network/RCTFileRequestHandler.mm index 4ca36256c68..cfcd8243862 100644 --- a/packages/react-native/Libraries/Network/RCTFileRequestHandler.mm +++ b/packages/react-native/Libraries/Network/RCTFileRequestHandler.mm @@ -53,14 +53,19 @@ RCT_EXPORT_MODULE() _fileQueue.maxConcurrentOperationCount = 4; } - __weak __block NSBlockOperation *weakOp; - __block NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{ + __weak NSBlockOperation *weakOp; + NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{ + NSBlockOperation *strongOp = weakOp; // Strong reference to avoid deallocation during execution + if (strongOp == nil || [strongOp isCancelled]) { + return; + } + // Get content length NSError *error = nil; NSFileManager *fileManager = [NSFileManager new]; NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:request.URL.path error:&error]; if (!fileAttributes) { - [delegate URLRequest:weakOp didCompleteWithError:error]; + [delegate URLRequest:strongOp didCompleteWithError:error]; return; } @@ -77,14 +82,14 @@ RCT_EXPORT_MODULE() expectedContentLength:[fileAttributes[NSFileSize] ?: @-1 integerValue] textEncodingName:nil]; - [delegate URLRequest:weakOp didReceiveResponse:response]; + [delegate URLRequest:strongOp didReceiveResponse:response]; // Load data NSData *data = [NSData dataWithContentsOfURL:request.URL options:NSDataReadingMappedIfSafe error:&error]; if (data) { - [delegate URLRequest:weakOp didReceiveData:data]; + [delegate URLRequest:strongOp didReceiveData:data]; } - [delegate URLRequest:weakOp didCompleteWithError:error]; + [delegate URLRequest:strongOp didCompleteWithError:error]; }]; weakOp = op;