diff --git a/AFNetworking/AFHTTPRequestOperation.m b/AFNetworking/AFHTTPRequestOperation.m index 7765f2a..a86a5a9 100644 --- a/AFNetworking/AFHTTPRequestOperation.m +++ b/AFNetworking/AFHTTPRequestOperation.m @@ -68,6 +68,10 @@ static dispatch_group_t http_request_operation_completion_group() { #pragma clang diagnostic ignored "-Warc-retain-cycles" #pragma clang diagnostic ignored "-Wgnu" self.completionBlock = ^{ + if (self.completionGroup) + { + dispatch_group_enter(self.completionGroup); + } dispatch_async(http_request_operation_processing_queue(), ^{ if (self.error) { if (failure) { @@ -94,7 +98,11 @@ static dispatch_group_t http_request_operation_completion_group() { }); } } - } + } + if (self.completionGroup) + { + dispatch_group_leave(self.completionGroup); + } }); }; #pragma clang diagnostic pop diff --git a/Tests/Tests/AFHTTPRequestOperationTests.m b/Tests/Tests/AFHTTPRequestOperationTests.m index cb44478..2735ea0 100644 --- a/Tests/Tests/AFHTTPRequestOperationTests.m +++ b/Tests/Tests/AFHTTPRequestOperationTests.m @@ -275,4 +275,37 @@ [[NSNotificationCenter defaultCenter] removeObserver:observer]; } +-(void)testThatCompletionBlockForBatchRequestsIsFiredAfterAllOperationCompletionBlocks +{ + __block BOOL firstBlock = NO; + __block BOOL secondBlock = NO; + NSURLRequest *request1 = [NSURLRequest requestWithURL:[NSURL URLWithString:@"/get" relativeToURL:self.baseURL]]; + AFHTTPRequestOperation *operation1 = [[AFHTTPRequestOperation alloc] initWithRequest:request1]; + [operation1 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { + firstBlock = YES; + } failure:nil]; + [operation1 setResponseSerializer:[AFHTTPResponseSerializer serializer]]; + + NSURLRequest *request2 = [NSURLRequest requestWithURL:[NSURL URLWithString:@"/delay/1" relativeToURL:self.baseURL]]; + AFHTTPRequestOperation *operation2 = [[AFHTTPRequestOperation alloc] initWithRequest:request2]; + [operation2 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { + secondBlock = YES; + } failure:nil]; + [operation2 setResponseSerializer:[AFHTTPResponseSerializer serializer]]; + + __block BOOL completionBlockFiredAfterOtherBlocks = NO; + NSArray * batchRequests = [AFURLConnectionOperation batchOfRequestOperations:@[operation1,operation2] + progressBlock:nil + completionBlock:^(NSArray *operations) { + if (firstBlock && secondBlock) + { + completionBlockFiredAfterOtherBlocks = YES; + } + }]; + NSOperationQueue * queue = [NSOperationQueue new]; + [queue addOperations:batchRequests waitUntilFinished:NO]; + + expect(completionBlockFiredAfterOtherBlocks).will.beTruthy(); +} + @end