我有一组数组,我需要循环并识别每个传递 200 状态代码的 url 域。如果第一个索引值通过,那么我将中断循环并将 url 保存在本地。这是我的代码:
for (int j = 0; j < items.count; j++){
NSString *urlStr2 = items[j];
[session GET:urlStr2 parameters:nil progress:^(NSProgress * _Nonnull uploadProgress) {
// nil
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// The domain name request is successful, processing data
NSURL *url = [NSURL URLWithString:urlStr2];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection cancelPreviousPerformRequestsWithTarget:self];
[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
if ([httpResponse statusCode] == 200){
h5UrlStr = urlStr2;
break;
}
}];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
// Domain name request failed
if (error.code == -1003) {
}
}];
}
但问题是当我在条件满足的情况下放置break时,会出现错误,说break语句不在循环中或切换目标c。我应该如何打破循环?请帮忙。谢谢
答案 0 :(得分:0)
在这种情况下,break 对您没有帮助,因为您是在 lambda(匿名函数)中调用它。这是完全不同的范围。正如我在您的代码中看到的,您最多启动 items.count
个并行请求,但您只需要第一个成功的结果。
一种可能的解决方案是为回调函数分配名称,摆脱循环并使用高级元素计数器进行相同的 GET
调用,以防在 j < items.count
期间每次失败。在这种情况下,所有请求都将是顺序的,一个接一个,直到其中一些请求成功。这可能需要一些时间。
另一种解决方案是并行启动请求(可能不是一次针对 items
的所有元素,而是针对某个块),并在每次成功调用时检查是否已经获得结果。如果是,只需忽略当前并返回。这速度更快,但会浪费带宽和计算资源。