gpt4 book ai didi

ios - NSURLSessionDataTask 的最大并发实例数

转载 作者:行者123 更新时间:2023-11-29 05:39:12 28 4
gpt4 key购买 nike

我有一个使用 NSURLSessionDataTask 调用 API 的函数,您可以在此处查看它:

- (void)getExplorerUrl:(void (^)(NSString *))measurement_url {
NSString *path = [NSString stringWithFormat:@"https://api.ooni.io/api/v1/measurements?report_id=%@&input=%@", self.report_id, self.url_id.url];
NSURL *url = [NSURL URLWithString:path];
NSURLSessionDataTask *downloadTask = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (!error) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
NSArray *resultsArray = [dic objectForKey:@"results"];
if ([resultsArray count] == 0)
measurement_url(nil);
measurement_url([[resultsArray objectAtIndex:0] objectForKey:@"measurement_url"]);
}
else {
// Fail
measurement_url(nil);
NSLog(@"error : %@", error.description);
}
}];
[downloadTask resume];
}

该函数使用完成处理程序在异步调用完成时返回一个值。

现在我想要一个 for 循环来循环许多对象并为每个对象调用此 API:

    for (Measurement *measurement in [Measurement measurementsWithJson]){
[measurement getExplorerUrl:^(NSString *measurement_url) {
if (measurement_url != nil){
//Do something
NSLog(@"%@ measurement_url %@",measurement.Id, measurement_url);
}
else {
NSLog(@"%@ measurement_url null", measurement.Id);
}
}];
}

有没有办法将最大并发异步调用设置为 10?一个调用结束后立即执行下一个调用。

最佳答案

我同意 @Rob 的观点,他可以为 URLSession 创建自己的配置。但是,如果这个 sharedSession 在不同的作业中使用,并且他希望该作业以最大并发异步调用数为 10 运行,我建议使用 NSOperationQueue dispatch_semaphore 来解决这个问题。请引用下面的例子来初步了解这些方法

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = 10;

for (int i = 1; i <= 30; i++) {
[queue addOperationWithBlock:^{
NSLog(@"[Q] %d", i);
sleep(1);
}];
}

dispatch_queue_t q = dispatch_queue_create("q.q", DISPATCH_QUEUE_CONCURRENT);
dispatch_semaphore_t s = dispatch_semaphore_create(10);
for (int i = 1; i <= 30; i++) {
dispatch_async(q, ^{
NSLog(@"[Q] %d", i);
sleep(1);
dispatch_semaphore_signal(s);
});

}

您可以从控制台观察查看结果。基本上这2种方法最多同时执行10个调用,只要其中一个调用完成,其他的就会进入执行队列。

希望这能帮助您解决问题。有需要的可以讨论。!!!

关于ios - NSURLSessionDataTask 的最大并发实例数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56728301/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com