[英]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.