From 7c82adae6171ea0a9bf96856e0bbb67108e1e121 Mon Sep 17 00:00:00 2001 From: "fischman@webrtc.org" Date: Wed, 30 Apr 2014 00:17:47 +0000 Subject: [PATCH] AppRTCDemo was blocking the main thread for network requests. This fixes it by making the background queue serial instead of using @synchronize to make the background operations serial. R=fischman@webrtc.org Review URL: https://webrtc-codereview.appspot.com/16379004 Patch from Bridger Maxwell . git-svn-id: http://webrtc.googlecode.com/svn/trunk@6028 4adac7df-926f-26a2-2b94-8c16560cd09d --- AUTHORS | 1 + .../examples/ios/AppRTCDemo/APPRTCAppClient.m | 40 ++++++++----------- 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/AUTHORS b/AUTHORS index 691601652e..d9bb54d551 100644 --- a/AUTHORS +++ b/AUTHORS @@ -3,6 +3,7 @@ Anil Kumar Ben Strong +Bridger Maxwell Christophe Dumez Eric Rescorla, RTFM Inc. Jie Mao diff --git a/talk/examples/ios/AppRTCDemo/APPRTCAppClient.m b/talk/examples/ios/AppRTCDemo/APPRTCAppClient.m index 9ac83ffc15..9ef0a7a74a 100644 --- a/talk/examples/ios/AppRTCDemo/APPRTCAppClient.m +++ b/talk/examples/ios/AppRTCDemo/APPRTCAppClient.m @@ -56,7 +56,8 @@ if (self = [super init]) { _ICEServerDelegate = delegate; _messageHandler = handler; - _backgroundQueue = dispatch_queue_create("RTCBackgroundQueue", NULL); + _backgroundQueue = dispatch_queue_create("RTCBackgroundQueue", + DISPATCH_QUEUE_SERIAL); _sendQueue = [NSMutableArray array]; // Uncomment to see Request/Response logging. // _verboseLogging = YES; @@ -72,11 +73,22 @@ } - (void)sendData:(NSData*)data { - @synchronized(self) { - [self maybeLogMessage:@"Send message"]; + [self maybeLogMessage:@"Send message"]; + + dispatch_async(self.backgroundQueue, ^{ [self.sendQueue addObject:[data copy]]; - } - [self requestQueueDrainInBackground]; + + if ([self.postMessageUrl length] < 1) { + return; + } + for (NSData* data in self.sendQueue) { + NSString* url = + [NSString stringWithFormat:@"%@/%@", + self.baseURL, self.postMessageUrl]; + [self sendData:data withUrl:url]; + } + [self.sendQueue removeAllObjects]; + }); } #pragma mark - Internal methods @@ -133,24 +145,6 @@ } } -- (void)requestQueueDrainInBackground { - dispatch_async(self.backgroundQueue, ^(void) { - // TODO(hughv): This can block the UI thread. Fix. - @synchronized(self) { - if ([self.postMessageUrl length] < 1) { - return; - } - for (NSData* data in self.sendQueue) { - NSString* url = - [NSString stringWithFormat:@"%@/%@", - self.baseURL, self.postMessageUrl]; - [self sendData:data withUrl:url]; - } - [self.sendQueue removeAllObjects]; - } - }); -} - - (void)sendData:(NSData*)data withUrl:(NSString*)url { NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];