Я пытаюсь решить проблему производителя-потребителя, но я хочу, чтобы мой потребительский поток блокировался до тех пор, пока данные не станут доступны.У меня есть несколько потоков, производящих данные, но только один поток потребляет их.Когда элементы быстро добавляются в массив, я получаю «Поток 4: Фатальная ошибка: Индекс выходит за пределы диапазона» @ «result = self.array.remove (at: 0)».Когда элементы добавляются по одному (например, медленно, 500+ миллисекунд), это работает как ожидалось.Это кажется намного проще в C # с Monitor.Wait () / Pulse ().Как я могу заставить это работать быстро?Заранее спасибо.
let consume: DispatchQueue = DispatchQueue.global(qos: .userInteractive)
consume.async {
while self.mConnect {
let dg = self.queue.take()//block until item is available
//do something
}
}
...
public class SynchronizedQueue<Element> {
fileprivate let semaphore = DispatchSemaphore(value: 0)
fileprivate let queue = DispatchQueue(label: "fooBar", attributes: .concurrent)
fileprivate var array = [Element]()
private var isWaiting : Bool = false
func take() -> Element {
var result : Element!
queue.sync {
if self.array.count == 0 {
print("Waiting...")
self.isWaiting = true
self.semaphore.wait()
}
self.isWaiting = false
print("Not waiting count = \(self.array.count)")
result = self.array.remove(at: 0)
}
return result
}
func add(_ element : Element) {
queue.sync {
self.array.append(element)
if self.isWaiting {
self.semaphore.signal()
}
}
}
}