我們正在使用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