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

标签 objective-c grand-central-dispatch semaphore

我有多个异步任务,它们都依赖于初始异步身份验证步骤才能成功。我正在使用信号量来阻止所有安全任务,直到身份验证完成。它主要用于计时目的,因为任务依赖于在身份验证结束时获得的安全 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/

相关文章:

ios - 当我按下其他按钮时,从 UITextField 自动激活麦克风按钮(语音输入模式)

ios - 使用 Objective-C 创建 iOS 框架

objective-c - iOS 4.3和iOS 5.0之间的iOS核心数据API有哪些更改?在哪里可以找到它们?

linux-kernel - LINUX 系统中的互斥量和信号量是否为 "Busy wait"?

objective-c - 将 Base SDK 从 iOS 6.0 更改为 iOS 5.0

ios - 如何将值从Helper类返回到 View Controller ?

macos - 合并 GCD 文件系统事件

objective-c - 执行cancelPreviousPerformRequestsWithTarget :selector:object: for all objects

c++ - 使用 pthreads 和信号量的生产者消费者同步错误

c - 在C中动态创建sembuf结构