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:)]; |
@@ -530,8 +530,56 @@ | @@ -530,8 +530,56 @@ | ||
530 | BOOL success = [instance isKindOfClass:[ASINetworkQueueSubclass class]]; | 530 | BOOL success = [instance isKindOfClass:[ASINetworkQueueSubclass class]]; |
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 | + | ||
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 | +} | ||
533 | 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