我NSURLConnection
用来发出多个异步请求。我想显示一个进度指示器,以显示在要执行的总数中完成了多少请求。但是,当我尝试在发出请求之前或在执行请求之前调用的另一个方法中设置并显示此进度指示器时,它不会显示。当请求被注释掉时,进度指示器显示正常。但如果不是这样,就好像 Xcode 向前看并看到一个异步请求即将到来并阻塞主线程,从而使 UI 更改变得不可能。
这是被调用的相关代码,包括请求和显示进度指示器的代码:
- (void)getRegionalInformationFromChecked:(NSSet *)set atIndex:(NSInteger)index {
__block BOOL responseRecieved = NO;
NSString *stringForURL = [NSString stringWithFormat:@"http://www.thebluealliance.com/api/v1/event/details?event=%@",[[set allObjects] objectAtIndex:index]];
NSURL *url = [NSURL URLWithString:stringForURL];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSLog(@"URL IS GO: %@", stringForURL);
[NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:url] queue:queue completionHandler:^(NSURLResponse *_response, NSData *_data, NSError *_error) {
NSLog(@"CHECKED DATA RETURNED AT INDEX %i", index);
NSError *error;
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:_data options:NSJSONReadingMutableContainers error:&error];
if (!_regionalDetails) {
_regionalDetails = [[NSMutableArray alloc] init];
}
[_regionalDetails addObject:dict];
responseRecieved = YES;
}];
regionalSchedulesToGet = [set count];
while (responseRecieved == NO) {}
[[MBProgressHUD HUDForView:[[UIApplication sharedApplication] keyWindow]] setLabelText:[NSString stringWithFormat: @"Getting regional %i of %i", index+2, [set count]]];
if (index+1 < [set count]) {
[self getRegionalInformationFromChecked:set atIndex:index+1];
} else {
[[MBProgressHUD HUDForView:[[UIApplication sharedApplication] keyWindow]] setLabelText:@"Writing to file"];
}
}
当异步请求的块被注释掉时,MBProgressHUD
显示它的值很好。但是当插入块时,SDK 拒绝更新进度指示器,即使在离开块之后(之后应该解决任何线程问题)。在没有更多请求显示之前它不会更新,此时它会显示“正在写入文件”。
为什么异步请求似乎阻塞了主线程,为什么我不能在调用请求之前或之后立即对主线程进行更改?