Мы используем GCD для выполнения некоторых операций обработки изображений «в фоновом режиме» в нашем представлении редактора изображений, который отлично работает. Проблема в том, что если мы открываем представление редактора, делаем некоторую обработку, а затем просто сидим в редакторе в течение 10-20 минут, мы получаем зависания OSSpinLockLock
, но мы не используем SpinLocks
или замки любого типа, у нас есть следующие свойства:Получение OSSpinLockLock при использовании Grand Central Dispatch (GCD)
@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' boolean. – Shizam