objective-c - BREAK 语句不在循环或切换目标 c
问题描述
我有一组数组,我需要循环并识别每个 url 域传递 200 状态代码。如果第一个索引值通过,那么我将打破循环并将 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) {
}
}];
}
但问题是当我在满足条件时放置中断时,会出现错误,说明中断语句不在循环或切换目标c中。我应该如何打破循环?请帮忙。谢谢
解决方案
在这种情况下,break 对您没有帮助,因为您在 lambda(匿名函数)中调用它。这是完全不同的范围。正如我在您的代码中看到的那样,您正在启动items.count
并行请求,但您只需要第一次成功的结果。
一种可能的解决方案是为回调函数分配名称,摆脱循环并GET
在每次失败时使用高级元素计数器进行相同的调用 while j < items.count
。在这种情况下,所有请求都将是顺序的,一个接一个,直到其中一些成功。这可能需要一些时间。
另一种解决方案是并行启动请求(可能不是同时针对所有元素items
,而是针对某个块),并在每次成功调用时检查是否已经获得结果。如果是,只需忽略当前并返回。这速度更快,但会浪费带宽和计算资源。
推荐阅读
- jquery - 如何计算元素内的行数并设置最大值?
- spring-restdocs - Spring Rest Docs 错误调用 docs/index.html
- xcode - 更改捆绑标识符后应用程序将无法运行
- java - 使用来自另一个数据集的值搜索和更新 Spark 数据集列
- jquery - 使用 jQuery 的响应式设计一旦刷新页面就会失败
- c# - 使用 C# 使用 SQL 查询将外键插入表中
- python - 格式化熊猫中的整数列
- ios - Swift - 无论哪个 ViewController 在应用程序启动时显示revealingSplashView
- python - 循环执行另一个文件夹中的脚本
- intellij-idea - IntelliJ IDEA 无法识别 lombok 的字段