gpt4 book ai didi

ios - 使用 dispatch_group 嵌套多个请求

转载 作者:行者123 更新时间:2023-11-29 11:54:41 47 4
gpt4 key购买 nike

我想向服务器发出多个请求,以一个接一个地获取帖子和评论。因此,我使用 dispatch_group 创建了这个示例,它一个接一个地连续获取所有 POSTS,然后在完成 POSTS 后,一个接一个地获取评论。

这是关于其工作原理的粗略模式。

  • 获取帖子 1
  • 获取帖子 2
  • 获取帖子 3
  • ....
  • 获取帖子 50
  • 获取评论 1
  • 获取评论 2
  • ...
  • 获取评论 50

所以,所有这些都应该如图所示连续工作,比如它获取帖子 1,以此结束,然后获取帖子 2 完成,依此类推。

以下示例可以很好地满足此目的。但是,现在我想回电以真正知道 50 条帖子的同步何时完成以及 50 条评论何时完成。我尝试通过在 requestOne 和 requestTwo 中的 for 循环之后添加 dispatch_group_notify 来实现。但是,通知方法似乎是在所有任务完成后调用的。如何实现?我的母语不是英语,所以如果我需要改进帖子,请写下来,我仍然可以尝试:)

@interface GroupTest ()

@property (nonatomic, readonly) dispatch_group_t group;
@property (nonatomic, readonly) dispatch_queue_t serialQueue;

@end


@implementation GroupTest

- (instancetype)init
{
if (self = [super init]) {
_group = dispatch_group_create();
_serialQueue = dispatch_queue_create("com.test.serial.queue",
DISPATCH_QUEUE_SERIAL);
}
return self;
}

- (void)start
{
dispatch_async(self.serialQueue, ^{

[self requestOneCompletion:^{
NSLog(@"Request 1 completed");
}];

[self requestTwoCompletion:^{
NSLog(@"Request 2 completed");
}];

});
}
- (void)requestTwoCompletion:(void(^)(void))completion
{
for (NSUInteger i = 1; i <= 50; i++) {
dispatch_group_enter(self.group);
[self requestComment:i
completion:^(id response){
NSLog(@"%@", response);
dispatch_group_leave(self.group);
}];
dispatch_group_wait(self.group, DISPATCH_TIME_FOREVER);
}

}


- (void)requestOneCompletion:(void(^)(void))completion
{
for (NSUInteger i = 1; i <= 50; i++) {
dispatch_group_enter(self.group);
[self requestPost:i
completion:^(id response){
NSLog(@"%@", response);
dispatch_group_leave(self.group);
}];
dispatch_group_wait(self.group, DISPATCH_TIME_FOREVER);
}
}

- (void)requestComment:(NSUInteger)comment
completion:(void(^)(id))completion
{
NSString *urlString = [NSString stringWithFormat:@"https://jsonplaceholder.typicode.com/comments/%lu", (unsigned long)comment];

NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:urlString]
completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
id object = [NSJSONSerialization JSONObjectWithData:data
options:0
error:nil];
completion(object);
}];
[dataTask resume];

}

- (void)requestPost:(NSUInteger)post
completion:(void(^)(id))completion
{
NSString *urlString = [NSString stringWithFormat:@"https://jsonplaceholder.typicode.com/posts/%lu", (unsigned long)post];

NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:urlString]
completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
id object = [NSJSONSerialization JSONObjectWithData:data
options:0
error:nil];
completion(object);
}];
[dataTask resume];
}

@end

最佳答案

我认为你想要做的是以下内容。请注意,这样做是为了在所有 50 次调用完成后调用 requestTwoCompletionrequestOneCompletion 的每个完成 block 。不保证 50 个调用的顺序。

我所做的主要更改是 dispatch_group_t 对于每个方法都是本地的,并且我将 dispatch_group_wait 移到了 for 循环之外。在这种情况下,它带走了 completion 的好处,因为等待会阻塞它完成的单元。如果您非常坚持使用完成并且它不会阻塞,您可以将其全部包装在 dispatch_async 中。

- (void)requestTwoCompletion:(void(^)(void))completion
{
dispatch_group_t group = dispatch_group_create();

for (NSUInteger i = 1; i <= 50; i++) {
dispatch_group_enter(group);
[self requestComment:i
completion:^(id response){
NSLog(@"%@", response);
dispatch_group_leave(group);
}];
}

dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

completion();
}


- (void)requestOneCompletion:(void(^)(void))completion
{
dispatch_group_t group = dispatch_group_create();

for (NSUInteger i = 1; i <= 50; i++) {
dispatch_group_enter(group);
[self requestPost:i
completion:^(id response){
NSLog(@"%@", response);
dispatch_group_leave(group);
}];
}

dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
}

因为这是在串行队列中,所以它的工作方式是 requestOneCompletion 将完成所有 50 个,然后 requestTwoCompletion 将在接下来运行所有 50 个。

关于ios - 使用 dispatch_group 嵌套多个请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39642741/

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