0

我有一个类,我想将其限制在一个线程中。准确地说,我希望在类私下创建的某个线程或串行队列上访问它的 void 返回方法。为了实现这一点,我将NSManagedObjectContextAPI 视为参考。有一种perform(block:() -> Void)方法可以做到这一点。

这带有一个我有点不舒服的代码模式。此 API 的用户需要调用perform(block:() -> Void)方法块中的对象。有没有更优雅的解决方案,我可以声明所有方法和属性都局限于这个特定的线程。所以基本上用户可以访问这些方法,但内部操作发生在预期的线程上。

我知道我可以转到每个方法并将该方法的工作分派到预期线程中的选项。但这是编写调度代码的额外开销。

4

1 回答 1

1

方法:

使用属性包装器

代码:

@propertyWrapper
struct QueueVariable<T> {

    private var _value  : T
    private let queue   : DispatchQueue

    var wrappedValue : T {

        get {
            queue.sync { _value }
        }

        set {
            queue.sync { _value = newValue }
        }
    }

    init(value: T,
         queue: DispatchQueue = DispatchQueue(label: "sync queue")) {
        _value      = value
        self.queue  = queue
    }
}

class Test {

    @QueueVariable(value: 100, queue: DispatchQueue(label: "aaa"))
    var a1

    @QueueVariable(value: "aaa")
    var a2
}

调用

要么通过调度队列,要么生成一个新队列。

let t1 = Test()

t1.a1 += 5

print(t1.a1)
print(t1.a2)
于 2019-11-20T11:23:58.447 回答