Skip to content

Commit 7cc6d3c

Browse files
author
Harry Eakins
committed
Use async request response API of GCDWebserver instead of the sync API + polling.
This reduces the number of idle wakeups dramatically. Before, there were 100 idle wakes per second per pending HTTP response, which made it very easy to trip the 150/sec average idle wakeup rate limit set by iOS.
1 parent 3cd8f55 commit 7cc6d3c

File tree

1 file changed

+11
-12
lines changed

1 file changed

+11
-12
lines changed

ios/RCTHttpServer.m

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
@interface RCTHttpServer : NSObject <RCTBridgeModule> {
1313
WGCDWebServer* _webServer;
14-
NSMutableDictionary* _requestResponses;
14+
NSMutableDictionary* _completionBlocks;
1515
}
1616
@end
1717

@@ -25,13 +25,16 @@ @implementation RCTHttpServer
2525

2626

2727
- (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) {
2931

3032
long long milliseconds = (long long)([[NSDate date] timeIntervalSince1970] * 1000.0);
3133
int r = arc4random_uniform(1000000);
3234
NSString *requestId = [NSString stringWithFormat:@"%lld:%d", milliseconds, r];
3335

34-
// it's a weird way of doing it, fix it
36+
[_completionBlocks setObject:completionBlock forKey:requestId];
37+
3538
@try {
3639
if ([WGCDWebServerTruncateHeaderValue(request.contentType) isEqualToString:@"application/json"]) {
3740
WGCDWebServerDataRequest* dataRequest = (WGCDWebServerDataRequest*)request;
@@ -52,14 +55,6 @@ - (void)initResponseReceivedFor:(WGCDWebServer *)server forType:(NSString*)type
5255
@"type": type,
5356
@"url": request.URL.relativeString}];
5457
}
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;
6358
}];
6459
}
6560

@@ -100,8 +95,12 @@ - (void)initResponseReceivedFor:(WGCDWebServer *)server forType:(NSString*)type
10095
NSData* data = [body dataUsingEncoding:NSUTF8StringEncoding];
10196
WGCDWebServerDataResponse* requestResponse = [[WGCDWebServerDataResponse alloc] initWithData:data contentType:type];
10297
requestResponse.statusCode = code;
98+
99+
WGCDWebServerCompletionBlock completionBlock = [_completionBlocks objectForKey:requestId];
103100

104-
[_requestResponses setObject:requestResponse forKey:requestId];
101+
completionBlock(requestResponse);
102+
103+
[_completionBlocks removeObjectForKey:requestId];
105104
}
106105

107106
@end

0 commit comments

Comments
 (0)