Swift中的C#blockingcollection

时间:2018-06-13 08:44:58

标签: c# swift blockingcollection

我正在努力将C#应用程序转换为Swift。一切都很顺利,但是我被困在C#程序中的dev使用阻塞集合的地方:

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

稍后,他们向队列中添加了一些内容,只是传递给类的简单整数,该类返回添加到队列中的消息:

mouseUsageMessageQueue.Add(new MouseUsageMessage(0));

然后程序使用foreach使用每条消息的ConsumingEnumerable通过队列:

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

我没有足够的经验与Swift知道我如何能够像上面在Swift中所描述的那样做。所以我的问题是:我怎么能像在Swift中用C#做的那样(见上面的代码)?

1 个答案:

答案 0 :(得分:0)

我对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等)。