【问题标题】:enumerate() method for generic async array通用异步数组的 enumerate() 方法
【发布时间】:2018-12-14 06:33:04
【问题描述】:

您好,我尝试为我的自定义异步数组创建 enumerate() 方法,但仍然出现编译错误。我的自定义类看起来像这样:

class AsyncArray<T> {

private var array = [T]()
private var queue = DispatchQueue(label: "async_queue", attributes: .concurrent)

    func enumerated() -> EnumeratedSequence<[T]> {
        var value = EnumeratedSequence<[T]>() // compilation error Cannot invoke initializer for type 'EnumeratedSequence<[T]>' with no arguments
        queue.sync {
            value = self.array.enumerated()
        }
        return value
    }
}

如何在我的自定义类中实现enumerated() 方法?

【问题讨论】:

    标签: arrays swift generics dispatch


    【解决方案1】:

    您分配给value 只是为了在sync 调用中立即覆盖它。没必要。

    DispatchQueue.sync 让你直接返回结果:

    import Dispatch
    
    class AsyncArray<T> {
        private var array = [T]()
        private var queue = DispatchQueue(label: "async_queue", attributes: .concurrent)
    
        func enumerated() -> EnumeratedSequence<[T]> {
            return queue.sync {
                return self.array.enumerated()
            }
        }
    }
    

    供参考:如果您需要分配给捕获的变量,就像您尝试做的那样(例如,这将是一个async 调用所必需的),它看起来像这样:

    import Dispatch
    
    class AsyncArray<T> {
        private var array = [T]()
        private var queue = DispatchQueue(label: "async_queue", attributes: .concurrent)
    
        func enumerated() -> EnumeratedSequence<[T]> {
            var result: EnumeratedSequence<[T]>?
            return someAsyncCall {
                result = self.array.enumerated()
            }
            waitForAsyncCallToFinish()
            return result!
        }
    }
    

    【讨论】:

    • 谢谢!您能否用someAsyncCall 解释第二个选项或举一些例子?我无法想象它是如何工作的
    • @PiterPan 现在很多 API 都是围绕使用完成处理程序作为异步工作建模的一种方式设计的。这是一个问题,因为很多时候你想要阻止并等待结果,所以你必须使用类似DispatchSemaphore 的东西来撤消他们在异步调用中所做的工作。在这种情况下,通常通过捕获局部变量result 并为其赋值来“返回”一个值
    • 但在这种情况下,我认为更好的解决方案是使用.barrier 标志作为等待结果而不是信号量。你怎么看?
    • 是的,但这只有在异步 API 使用调度队列并且公开了在您自己的队列上调度它的能力时才有可能。
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多