Made requestsCount a public-readable property of ASINetworkQueue
Added some rough tests to check for crashes on queue dealloc
Showing
5 changed files
with
64 additions
and
4 deletions
| @@ -104,4 +104,5 @@ | @@ -104,4 +104,5 @@ | ||
| 104 | @property (assign) BOOL shouldCancelAllRequestsOnFailure; | 104 | @property (assign) BOOL shouldCancelAllRequestsOnFailure; |
| 105 | @property (assign) id delegate; | 105 | @property (assign) id delegate; |
| 106 | @property (assign) BOOL showAccurateProgress; | 106 | @property (assign) BOOL showAccurateProgress; |
| 107 | +@property (assign, readonly) int requestsCount; | ||
| 107 | @end | 108 | @end |
| @@ -177,18 +177,24 @@ | @@ -177,18 +177,24 @@ | ||
| 177 | - (void)requestDidFail:(ASIHTTPRequest *)request | 177 | - (void)requestDidFail:(ASIHTTPRequest *)request |
| 178 | { | 178 | { |
| 179 | [self setRequestsCount:[self requestsCount]-1]; | 179 | [self setRequestsCount:[self requestsCount]-1]; |
| 180 | + [self updateNetworkActivityIndicator]; | ||
| 180 | if ([self requestDidFailSelector]) { | 181 | if ([self requestDidFailSelector]) { |
| 181 | [[self delegate] performSelector:[self requestDidFailSelector] withObject:request]; | 182 | [[self delegate] performSelector:[self requestDidFailSelector] withObject:request]; |
| 182 | } | 183 | } |
| 183 | if ([self shouldCancelAllRequestsOnFailure] && [self requestsCount] > 0) { | 184 | if ([self shouldCancelAllRequestsOnFailure] && [self requestsCount] > 0) { |
| 184 | [self cancelAllOperations]; | 185 | [self cancelAllOperations]; |
| 185 | } | 186 | } |
| 186 | - [self updateNetworkActivityIndicator]; | 187 | + if ([self requestsCount] == 0) { |
| 188 | + if ([self queueDidFinishSelector]) { | ||
| 189 | + [[self delegate] performSelector:[self queueDidFinishSelector] withObject:self]; | ||
| 190 | + } | ||
| 191 | + } | ||
| 187 | } | 192 | } |
| 188 | 193 | ||
| 189 | - (void)requestDidFinish:(ASIHTTPRequest *)request | 194 | - (void)requestDidFinish:(ASIHTTPRequest *)request |
| 190 | { | 195 | { |
| 191 | [self setRequestsCount:[self requestsCount]-1]; | 196 | [self setRequestsCount:[self requestsCount]-1]; |
| 197 | + [self updateNetworkActivityIndicator]; | ||
| 192 | if ([self requestDidFinishSelector]) { | 198 | if ([self requestDidFinishSelector]) { |
| 193 | [[self delegate] performSelector:[self requestDidFinishSelector] withObject:request]; | 199 | [[self delegate] performSelector:[self requestDidFinishSelector] withObject:request]; |
| 194 | } | 200 | } |
| @@ -197,7 +203,6 @@ | @@ -197,7 +203,6 @@ | ||
| 197 | [[self delegate] performSelector:[self queueDidFinishSelector] withObject:self]; | 203 | [[self delegate] performSelector:[self queueDidFinishSelector] withObject:self]; |
| 198 | } | 204 | } |
| 199 | } | 205 | } |
| 200 | - [self updateNetworkActivityIndicator]; | ||
| 201 | } | 206 | } |
| 202 | 207 | ||
| 203 | 208 |
| @@ -713,7 +713,7 @@ | @@ -713,7 +713,7 @@ | ||
| 713 | 713 | ||
| 714 | // Test compressed body | 714 | // Test compressed body |
| 715 | // Body is deflated by ASIHTTPRequest, sent, inflated by the server, printed, deflated by mod_deflate, response is inflated by ASIHTTPRequest | 715 | // Body is deflated by ASIHTTPRequest, sent, inflated by the server, printed, deflated by mod_deflate, response is inflated by ASIHTTPRequest |
| 716 | - ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://asi/ASIHTTPRequest/tests/compressed_post_body"]]; | 716 | + ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://allseeing-i.com/ASIHTTPRequest/tests/compressed_post_body"]]; |
| 717 | [request setRequestMethod:@"PUT"]; | 717 | [request setRequestMethod:@"PUT"]; |
| 718 | [request setShouldCompressRequestBody:YES]; | 718 | [request setShouldCompressRequestBody:YES]; |
| 719 | [request appendPostData:data]; | 719 | [request appendPostData:data]; |
| @@ -13,6 +13,7 @@ | @@ -13,6 +13,7 @@ | ||
| 13 | #endif | 13 | #endif |
| 14 | 14 | ||
| 15 | @class ASIHTTPRequest; | 15 | @class ASIHTTPRequest; |
| 16 | +@class ASINetworkQueue; | ||
| 16 | 17 | ||
| 17 | @interface ASINetworkQueueTests : GHTestCase { | 18 | @interface ASINetworkQueueTests : GHTestCase { |
| 18 | ASIHTTPRequest *requestThatShouldFail; | 19 | ASIHTTPRequest *requestThatShouldFail; |
| @@ -24,6 +25,8 @@ | @@ -24,6 +25,8 @@ | ||
| 24 | NSOperationQueue *immediateCancelQueue; | 25 | NSOperationQueue *immediateCancelQueue; |
| 25 | NSMutableArray *failedRequests; | 26 | NSMutableArray *failedRequests; |
| 26 | NSMutableArray *finishedRequests; | 27 | NSMutableArray *finishedRequests; |
| 28 | + | ||
| 29 | + ASINetworkQueue *releaseTestQueue; | ||
| 27 | } | 30 | } |
| 28 | 31 | ||
| 29 | - (void)testFailure; | 32 | - (void)testFailure; |
| @@ -37,8 +40,11 @@ | @@ -37,8 +40,11 @@ | ||
| 37 | 40 | ||
| 38 | - (void)setProgress:(float)newProgress; | 41 | - (void)setProgress:(float)newProgress; |
| 39 | - (void)testSubclass; | 42 | - (void)testSubclass; |
| 43 | +- (void)testQueueReleaseOnRequestComplete; | ||
| 44 | +- (void)testQueueReleaseOnQueueComplete; | ||
| 40 | 45 | ||
| 41 | @property (retain) NSOperationQueue *immediateCancelQueue; | 46 | @property (retain) NSOperationQueue *immediateCancelQueue; |
| 42 | @property (retain) NSMutableArray *failedRequests; | 47 | @property (retain) NSMutableArray *failedRequests; |
| 43 | @property (retain) NSMutableArray *finishedRequests; | 48 | @property (retain) NSMutableArray *finishedRequests; |
| 49 | +@property (retain) ASINetworkQueue *releaseTestQueue; | ||
| 44 | @end | 50 | @end |
| @@ -484,7 +484,7 @@ | @@ -484,7 +484,7 @@ | ||
| 484 | [self setImmediateCancelQueue:[[[NSOperationQueue alloc] init] autorelease]]; | 484 | [self setImmediateCancelQueue:[[[NSOperationQueue alloc] init] autorelease]]; |
| 485 | int i; | 485 | int i; |
| 486 | for (i=0; i<100; i++) { | 486 | for (i=0; i<100; i++) { |
| 487 | - ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://asi"]]; | 487 | + ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://allseeing-i.com"]]; |
| 488 | [request setDelegate:self]; | 488 | [request setDelegate:self]; |
| 489 | [request setDidFailSelector:@selector(immediateCancelFail:)]; | 489 | [request setDidFailSelector:@selector(immediateCancelFail:)]; |
| 490 | [request setDidFinishSelector:@selector(immediateCancelFinish:)]; | 490 | [request setDidFinishSelector:@selector(immediateCancelFinish:)]; |
| @@ -531,7 +531,55 @@ | @@ -531,7 +531,55 @@ | ||
| 531 | GHAssertTrue(success,@"Convenience constructor failed to return an instance of the correct class"); | 531 | GHAssertTrue(success,@"Convenience constructor failed to return an instance of the correct class"); |
| 532 | } | 532 | } |
| 533 | 533 | ||
| 534 | + | ||
| 535 | +// Test releasing the queue in a couple of ways - the purpose of these tests is really just to ensure we don't crash | ||
| 536 | +- (void)testQueueReleaseOnRequestComplete | ||
| 537 | +{ | ||
| 538 | + [[self releaseTestQueue] cancelAllOperations]; | ||
| 539 | + [self setReleaseTestQueue:[ASINetworkQueue queue]]; | ||
| 540 | + int i; | ||
| 541 | + for (i=0; i<5; i++) { | ||
| 542 | + ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://allseeing-i.com"]]; | ||
| 543 | + [request setDelegate:self]; | ||
| 544 | + [request setDidFailSelector:@selector(fail:)]; | ||
| 545 | + [request setDidFinishSelector:@selector(finish:)]; | ||
| 546 | + [[self releaseTestQueue] addOperation:request]; | ||
| 547 | + } | ||
| 548 | +} | ||
| 549 | + | ||
| 550 | +- (void)fail:(ASIHTTPRequest *)request | ||
| 551 | +{ | ||
| 552 | + if ([[self releaseTestQueue] requestsCount] == 0) { | ||
| 553 | + [self setReleaseTestQueue:nil]; | ||
| 554 | + } | ||
| 555 | +} | ||
| 556 | + | ||
| 557 | +- (void)finish:(ASIHTTPRequest *)request | ||
| 558 | +{ | ||
| 559 | + if ([[self releaseTestQueue] requestsCount] == 0) { | ||
| 560 | + [self setReleaseTestQueue:nil]; | ||
| 561 | + } | ||
| 562 | +} | ||
| 563 | + | ||
| 564 | +- (void)testQueueReleaseOnQueueComplete | ||
| 565 | +{ | ||
| 566 | + [[self releaseTestQueue] cancelAllOperations]; | ||
| 567 | + [self setReleaseTestQueue:[ASINetworkQueue queue]]; | ||
| 568 | + [[self releaseTestQueue] setDelegate:self]; | ||
| 569 | + int i; | ||
| 570 | + for (i=0; i<5; i++) { | ||
| 571 | + ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://allseeing-i.com"]]; | ||
| 572 | + [[self releaseTestQueue] addOperation:request]; | ||
| 573 | + } | ||
| 574 | +} | ||
| 575 | + | ||
| 576 | +- (void)queueComplete:(ASINetworkQueue *)queue | ||
| 577 | +{ | ||
| 578 | + [self setReleaseTestQueue:nil]; | ||
| 579 | +} | ||
| 580 | + | ||
| 534 | @synthesize immediateCancelQueue; | 581 | @synthesize immediateCancelQueue; |
| 535 | @synthesize failedRequests; | 582 | @synthesize failedRequests; |
| 536 | @synthesize finishedRequests; | 583 | @synthesize finishedRequests; |
| 584 | +@synthesize releaseTestQueue; | ||
| 537 | @end | 585 | @end |
-
Please register or login to post a comment