Start using a custom runloopmode to stop the iphone trying to draw from secondary threads
Who knows - this might even be more efficient!
Showing
4 changed files
with
17 additions
and
5 deletions
@@ -13,6 +13,8 @@ | @@ -13,6 +13,8 @@ | ||
13 | #import "ASIHTTPRequest.h" | 13 | #import "ASIHTTPRequest.h" |
14 | #import "NSHTTPCookieAdditions.h" | 14 | #import "NSHTTPCookieAdditions.h" |
15 | 15 | ||
16 | +static CFStringRef ASIHTTPRequestRunMode = CFSTR("ASIHTTPRequest"); | ||
17 | + | ||
16 | static NSString *NetworkRequestErrorDomain = @"com.Your-Company.Your-Product.NetworkError."; | 18 | static NSString *NetworkRequestErrorDomain = @"com.Your-Company.Your-Product.NetworkError."; |
17 | 19 | ||
18 | static const CFOptionFlags kNetworkEvents = kCFStreamEventOpenCompleted | | 20 | static const CFOptionFlags kNetworkEvents = kCFStreamEventOpenCompleted | |
@@ -136,6 +138,10 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy | @@ -136,6 +138,10 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy | ||
136 | // Create the request | 138 | // Create the request |
137 | - (void)main | 139 | - (void)main |
138 | { | 140 | { |
141 | + | ||
142 | + [pool release]; | ||
143 | + pool = [[NSAutoreleasePool alloc] init]; | ||
144 | + | ||
139 | complete = NO; | 145 | complete = NO; |
140 | 146 | ||
141 | // Create a new HTTP request. | 147 | // Create a new HTTP request. |
@@ -199,6 +205,7 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy | @@ -199,6 +205,7 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy | ||
199 | // Start the request | 205 | // Start the request |
200 | - (void)loadRequest | 206 | - (void)loadRequest |
201 | { | 207 | { |
208 | + CFRunLoopAddCommonMode(CFRunLoopGetCurrent(),ASIHTTPRequestRunMode); | ||
202 | 209 | ||
203 | [authenticationLock release]; | 210 | [authenticationLock release]; |
204 | authenticationLock = [[NSConditionLock alloc] initWithCondition:1]; | 211 | authenticationLock = [[NSConditionLock alloc] initWithCondition:1]; |
@@ -234,12 +241,12 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy | @@ -234,12 +241,12 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy | ||
234 | } | 241 | } |
235 | 242 | ||
236 | // Schedule the stream | 243 | // Schedule the stream |
237 | - CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes); | 244 | + CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetCurrent(), ASIHTTPRequestRunMode); |
238 | 245 | ||
239 | // Start the HTTP connection | 246 | // Start the HTTP connection |
240 | if (!CFReadStreamOpen(readStream)) { | 247 | if (!CFReadStreamOpen(readStream)) { |
241 | CFReadStreamSetClient(readStream, 0, NULL, NULL); | 248 | CFReadStreamSetClient(readStream, 0, NULL, NULL); |
242 | - CFReadStreamUnscheduleFromRunLoop(readStream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes); | 249 | + CFReadStreamUnscheduleFromRunLoop(readStream, CFRunLoopGetCurrent(), ASIHTTPRequestRunMode); |
243 | CFRelease(readStream); | 250 | CFRelease(readStream); |
244 | readStream = NULL; | 251 | readStream = NULL; |
245 | [self failWithProblem:@"Unable to start http connection"]; | 252 | [self failWithProblem:@"Unable to start http connection"]; |
@@ -276,8 +283,12 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy | @@ -276,8 +283,12 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy | ||
276 | break; | 283 | break; |
277 | } | 284 | } |
278 | [self updateProgressIndicators]; | 285 | [self updateProgressIndicators]; |
279 | - [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:endDate]; | 286 | + CFRunLoopRunInMode(ASIHTTPRequestRunMode,0.5,YES); |
287 | + //[[NSRunLoop currentRunLoop] runMode:NSRunLoopCommonModes beforeDate:endDate]; | ||
280 | } | 288 | } |
289 | + | ||
290 | + [pool release]; | ||
291 | + pool = nil; | ||
281 | } | 292 | } |
282 | 293 | ||
283 | // Cancel loading and clean up | 294 | // Cancel loading and clean up |
@@ -286,7 +297,7 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy | @@ -286,7 +297,7 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy | ||
286 | if (readStream) { | 297 | if (readStream) { |
287 | CFReadStreamClose(readStream); | 298 | CFReadStreamClose(readStream); |
288 | CFReadStreamSetClient(readStream, kCFStreamEventNone, NULL, NULL); | 299 | CFReadStreamSetClient(readStream, kCFStreamEventNone, NULL, NULL); |
289 | - CFReadStreamUnscheduleFromRunLoop(readStream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes); | 300 | + CFReadStreamUnscheduleFromRunLoop(readStream, CFRunLoopGetCurrent(), ASIHTTPRequestRunMode); |
290 | CFRelease(readStream); | 301 | CFRelease(readStream); |
291 | readStream = NULL; | 302 | readStream = NULL; |
292 | } | 303 | } |
@@ -811,7 +822,7 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy | @@ -811,7 +822,7 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy | ||
811 | if (readStream) { | 822 | if (readStream) { |
812 | CFReadStreamClose(readStream); | 823 | CFReadStreamClose(readStream); |
813 | CFReadStreamSetClient(readStream, kCFStreamEventNone, NULL, NULL); | 824 | CFReadStreamSetClient(readStream, kCFStreamEventNone, NULL, NULL); |
814 | - CFReadStreamUnscheduleFromRunLoop(readStream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes); | 825 | + CFReadStreamUnscheduleFromRunLoop(readStream, CFRunLoopGetCurrent(), ASIHTTPRequestRunMode); |
815 | CFRelease(readStream); | 826 | CFRelease(readStream); |
816 | readStream = NULL; | 827 | readStream = NULL; |
817 | } | 828 | } |
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
-
Please register or login to post a comment