Синхронизация class OperationScheduler { var readerQueue = NSOperationQueue() var writerQueue = NSOperationQueue() init () { // Читатели должны выполняться параллельно readerQueue.maxConcurrentOperationCount = MAX // Писатели должны выполняться последовательно writerQueue.maxConcurrentOperationCount = 1 } ... }
Синхронизация func addReaderOperation(operation: NSBlockOperation) { // Зависим от выполнения всех писателей for writerOperation in writerQueue.operations { operation.addDependency(writerOperation) } readerQueue.addOperation(operation) }
Синхронизация func addWriterOperation(operation: NSBlockOperation) { // Все читатели зависят от нового писателя for readerOperation in readerQueue.operations { readerOperation.addDependency(operation) } writerQueue.addOperation(operation) }
Синхронизация func startPhilosopher(index: Int) { let operation = PhilosopherBlockOperation(index: index) let leftQueue = getLeftPhilosopher(index) let leftPhilosopherEats = leftQueue.operationCount > 0 if (leftPhilosopherEats) { for leftOperation in leftQueue.operations { operation.addDependency(leftOperation) } } // То же и для правого соседа let currentPhilosopherQueue = philosopherQueues[index] currentPhilosopherQueue.addOperation(operation) }