11
11
12
12
@interface RCTHttpServer : NSObject <RCTBridgeModule> {
13
13
WGCDWebServer* _webServer;
14
- NSMutableDictionary * _requestResponses ;
14
+ NSMutableDictionary * _completionBlocks ;
15
15
}
16
16
@end
17
17
@@ -25,13 +25,18 @@ @implementation RCTHttpServer
25
25
26
26
27
27
- (void )initResponseReceivedFor : (WGCDWebServer *)server forType : (NSString *)type {
28
- [server addDefaultHandlerForMethod: type requestClass: [WGCDWebServerDataRequest class ] processBlock: ^WGCDWebServerResponse *(WGCDWebServerRequest* request) {
28
+ [server addDefaultHandlerForMethod: type
29
+ requestClass: [WGCDWebServerDataRequest class ]
30
+ asyncProcessBlock: ^(WGCDWebServerRequest* request, WGCDWebServerCompletionBlock completionBlock) {
29
31
30
32
long long milliseconds = (long long )([[NSDate date ] timeIntervalSince1970 ] * 1000.0 );
31
33
int r = arc4random_uniform (1000000 );
32
34
NSString *requestId = [NSString stringWithFormat: @" %lld :%d " , milliseconds, r];
33
35
34
- // it's a weird way of doing it, fix it
36
+ @synchronized (self) {
37
+ [_completionBlocks setObject: completionBlock forKey: requestId];
38
+ }
39
+
35
40
@try {
36
41
if ([WGCDWebServerTruncateHeaderValue (request.contentType) isEqualToString: @" application/json" ]) {
37
42
WGCDWebServerDataRequest* dataRequest = (WGCDWebServerDataRequest*)request;
@@ -52,14 +57,6 @@ - (void)initResponseReceivedFor:(WGCDWebServer *)server forType:(NSString*)type
52
57
@" type" : type,
53
58
@" url" : request.URL .relativeString }];
54
59
}
55
-
56
- while ([_requestResponses objectForKey: requestId] == NULL ) {
57
- [NSThread sleepForTimeInterval: 0 .01f ];
58
- }
59
-
60
- WGCDWebServerDataResponse* response = [_requestResponses objectForKey: requestId];
61
- [_requestResponses removeObjectForKey: requestId];
62
- return response;
63
60
}];
64
61
}
65
62
@@ -100,8 +97,14 @@ - (void)initResponseReceivedFor:(WGCDWebServer *)server forType:(NSString*)type
100
97
NSData * data = [body dataUsingEncoding: NSUTF8StringEncoding];
101
98
WGCDWebServerDataResponse* requestResponse = [[WGCDWebServerDataResponse alloc ] initWithData: data contentType: type];
102
99
requestResponse.statusCode = code;
103
-
104
- [_requestResponses setObject: requestResponse forKey: requestId];
100
+
101
+ WGCDWebServerCompletionBlock completionBlock = nil ;
102
+ @synchronized (self) {
103
+ completionBlock = [_completionBlocks objectForKey: requestId];
104
+ [_completionBlocks removeObjectForKey: requestId];
105
+ }
106
+
107
+ completionBlock (requestResponse);
105
108
}
106
109
107
110
@end
0 commit comments