BREAK 语句不在循环中或切换目标 c

时间:2021-05-04 08:30:26

标签: objective-c loops break

我有一组数组,我需要循环并识别每个传递 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。我应该如何打破循环?请帮忙。谢谢

1 个答案:

答案 0 :(得分:0)

在这种情况下,break 对您没有帮助,因为您是在 lambda(匿名函数)中调用它。这是完全不同的范围。正如我在您的代码中看到的,您最多启动 items.count 个并行请求,但您只需要第一个成功的结果。

一种可能的解决方案是为回调函数分配名称,摆脱循环并使用高级元素计数器进行相同的 GET 调用,以防在 j < items.count 期间每次失败。在这种情况下,所有请求都将是顺序的,一个接一个,直到其中一些请求成功。这可能需要一些时间。

另一种解决方案是并行启动请求(可能不是一次针对 items 的所有元素,而是针对某个块),并在每次成功调用时检查是否已经获得结果。如果是,只需忽略当前并返回。这速度更快,但会浪费带宽和计算资源。

相关问题