C # blockingcollection в Swift - PullRequest
       17

C # blockingcollection в Swift

0 голосов
/ 13 июня 2018

Я работаю над преобразованием приложения C # в Swift.Все идет хорошо, но я застрял в точке, где разработчик в программе на C # использовал коллекцию Blocking:

public static BlockingCollection<MouseUsageMessage> mouseUsageMessageQueue = new BlockingCollection<MouseUsageMessage>();

Позже они добавляют что-то в очередь, просто передается простое целое числов класс, который возвращает сообщение, которое добавляется в очередь:

mouseUsageMessageQueue.Add(new MouseUsageMessage(0));

Затем программа проходит через очередь с foreach, используя ConsumingEnumerable каждого сообщения:

foreach(MouseUsageMessage msg in mouseUsageMessageQueue.GetConsumingEnumerable()){
     // do something
}

Iу меня недостаточно опыта работы со Swift, чтобы понять, как я могу сделать то же самое, что описано выше в Swift.Итак, мой вопрос здесь: как я могу сделать то же, что и в C # (см. Код выше) в Swift?

1 Ответ

0 голосов
/ 13 июня 2018

У меня нет опыта работы с C #, но я понимаю, что BlockingCollection это просто потокобезопасный массив.В Swift массивы не являются поточно-ориентированными, однако вы можете обернуть свои массивы универсальным классом и ограничить доступ к нему с помощью очереди отправки.Я видел, как они называют это синхронизированной коллекцией в Интернете, но примеры, которые я видел, не используют протокол Collection, теряя большую функциональность.Вот пример, который я написал:

public class BlockingCollection<T>: Collection {

    private var array: [T] = []
    private let queue = DispatchQueue(label: "com.myapp.threading") // some arbitrary label

    public var startIndex: Int {
        return queue.sync {
            return array.startIndex
        }
    }

    public var endIndex: Int {
        return queue.sync {
            return array.endIndex
        }
    }

    public func append(newElement: T) {
        return queue.sync {
            array.append(newElement)
        }
    }

    public subscript(index: Int) -> T {
        set {
            queue.sync {
                array[index] = newValue
            }
        }
        get {
            return queue.sync {
                return array[index]
            }
        }
    }

    public func index(after i: Int) -> Int {
        return queue.sync {
            return array.index(after: i)
        }
    }
}

Благодаря мощным расширениям протоколов в Swift вы получаете все типичные функции коллекции (forEach, filter, map и т. Д.) Бесплатно.

...