gpt4 book ai didi

objective-c - 使用信号量阻塞很多,然后释放所有

转载 作者:搜寻专家 更新时间:2023-10-30 20:00:03 25 4
gpt4 key购买 nike

我有多个异步任务,它们都依赖于初始异步身份验证步骤才能成功。我正在使用信号量来阻止所有安全任务,直到身份验证完成。它主要用于计时目的,因为任务依赖于在身份验证结束时获得的安全 token 。身份验证涉及网络请求,可能需要几秒钟。

我下面代码的难点似乎是在身份验证后发出的 dispatch_semaphore_signal() 仅表示第一个信号量锁可能会继续。第二个将继续阻止。将来可能会有很多 moew 阻塞任务,都在等待信号量。

我想知道是否有更简洁的方法来处理这种阻塞。我相信每个等待的任务都可以立即发出另一个 dispatch_semaphore_signal(),从而释放下一个任务,依此类推。有没有办法在一次调用中释放所有阻塞信号量?

是否有更简洁的方法来使用 GCD 执行此操作?我不熟悉 GCD,因此在以下用法的上下文中,代码片段会有所帮助。

dispatch_semaphore_t sem = dispatch_semaphore_create(0);

// in actuality, these 3 may be any where in the app, in different classes, methods, etc
// so a completionHandler is not possible
[self authentication]; // async, could take many seconds
[self authenticatedTask1]; // async
[self authenticatedTask2]; // async

- (void) authentication {
// async url request, assume it is configured here
[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
// authenticate
authenticated = TRUE;
secure_token = @"4rjiofwefsdf"; // obtained during auth
dispatch_semaphore_signal(sem);
}];
}

- (void) authenticatedTask1 {
// put on new thread, so semaphore doesn't block program
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
if(!authenticated){
// wait until authenticated
dispatch_semaphore_wait(sem)
}
// continue after authenticated, using secure_token
});
}

- (void) authenticatedTask2 {
// put on new thread, so semaphore doesn't block program
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
if(!authenticated){
// wait until authenticated
dispatch_semaphore_wait(sem)
}
// continue after authenticated, using secure_token
});
}

最佳答案

您可以将认证后的任务放入各自挂起的调度队列中,认证成功后恢复调度队列。

关于objective-c - 使用信号量阻塞很多,然后释放所有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23396458/

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