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,16 @@ @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
+ [_completionBlocks setObject: completionBlock forKey: requestId];
37
+
35
38
@try {
36
39
if ([WGCDWebServerTruncateHeaderValue (request.contentType) isEqualToString: @" application/json" ]) {
37
40
WGCDWebServerDataRequest* dataRequest = (WGCDWebServerDataRequest*)request;
@@ -52,14 +55,6 @@ - (void)initResponseReceivedFor:(WGCDWebServer *)server forType:(NSString*)type
52
55
@" type" : type,
53
56
@" url" : request.URL .relativeString }];
54
57
}
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
58
}];
64
59
}
65
60
@@ -100,8 +95,12 @@ - (void)initResponseReceivedFor:(WGCDWebServer *)server forType:(NSString*)type
100
95
NSData * data = [body dataUsingEncoding: NSUTF8StringEncoding];
101
96
WGCDWebServerDataResponse* requestResponse = [[WGCDWebServerDataResponse alloc ] initWithData: data contentType: type];
102
97
requestResponse.statusCode = code;
98
+
99
+ WGCDWebServerCompletionBlock completionBlock = [_completionBlocks objectForKey: requestId];
103
100
104
- [_requestResponses setObject: requestResponse forKey: requestId];
101
+ completionBlock (requestResponse);
102
+
103
+ [_completionBlocks removeObjectForKey: requestId];
105
104
}
106
105
107
106
@end
0 commit comments