我们正在使用GCD在图像编辑器视图中“在背景中”执行一些图像处理操作,效果很好。问题是如果我们打开编辑器视图,做一些处理,然后在编辑器视图中停留10-20分钟,我们会得到这些OSSpinLockLock
冻结,但我们没有使用SpinLocks
或任何类型的锁,我们有这些属性:使用Grand Central Dispatch(GCD)时获取OSSpinLockLock
@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>....
}];
});
我想知道如果它的信号不知何故。
你是对的,如果我使用串行队列,那么我不应该需要一个信号量。取消是好的,我通过'_stopProcessing'布尔值来处理。 – Shizam 2013-03-08 17:28:13