我们正在使用 GCD 在我们的图像编辑器视图中“在后台”执行一些图像处理操作,效果很好。问题是,如果我们打开编辑器视图,进行一些处理,然后在编辑器视图中停留 10-20 分钟,我们会得到这些OSSpinLockLock
冻结,但我们没有使用SpinLocks
或任何类型的锁定,我们有以下属性:
@property (nonatomic, readonly) dispatch_semaphore_t processingSemaphore;
@property (nonatomic, readonly) dispatch_queue_t serialQueue;
并像这样设置队列:
processingSemaphore = dispatch_semaphore_create(1);
serialQueue = dispatch_queue_create("com.myapp.imageProcessingQueue", NULL);
dispatch_set_target_queue(serialQueue, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, NULL));
并因此处理:
dispatch_async(self.serialQueue, ^{
dispatch_semaphore_wait(self.processingSemaphore, DISPATCH_TIME_FOREVER);
....<do stuff>....
dispatch_semaphore_signal(self.processingSemaphore);
dispatch_sync(dispatch_get_main_queue(), ^{
....<notify that we're done>....
}];
});
我想知道它是否是某种信号量。