繁体   English   中英

如何在@synchronized块中等待完成处理程序?

[英]How to wait for completion handler inside a @synchronized block?

我想在关键部分(使用@synchronized块)内同步调用完成处理程序。 我试图等待使用信号量的完成处理程序,但从未调用信号量信号。

这是我在做什么:

NSNumber *lock = 0;
@synchronized(lock) {
    // critical section code begins
    dispatch_semaphore_t sema = dispatch_semaphore_create(0);
    [self someMethodWithCompletionHandler:^(BOOL result) {
        // execute completion handler
        dispatch_semaphore_signal(sema);
    }];
    // wait for completion block to finish
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    // critical section code ends
}

我相信,由于@synchronized块,完成处理程序在与调用方相同的线程上被调用,从而导致死锁。 那正确吗? 如果是,那又如何实现呢?

谢谢!

我会避免@synchronized并使用串行调度队列来序列化关键部分中的工作。 您仍然可以使用信号量来阻塞串行调度队列,直到异步操作完成为止。

串行分派队列保证了一次只能有一个代码块进入关键部分,并且没有阻塞主队列的风险。

您需要在类初始化期间创建串行队列

@property (strong,nonatomic) dispatch_queue_t serialQueue;

- (id)init {
    if (self = [super init]) {
        self.serialQueue = dispatch_queue_create("com.example.CriticalTaskQueue", NULL);
    }
    return self;
}

- submitSomeCriticalWork() {

    dispatch_async(self.serialQueue, ^{
        dispatch_semaphore_t sema = dispatch_semaphore_create(0);
        [self someMethodWithCompletionHandler:^(BOOL result) {
         // execute completion handler
            dispatch_semaphore_signal(sema);
        }];
    // wait for completion block to finish
     dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    // critical section code ends
   }];

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM