Есть ли элегантный способ ограничить класс потоком?

У меня есть класс, который я хочу ограничить потоком. Чтобы быть точным, я хочу, чтобы методы возврата void были доступны в определенном потоке или последовательной очереди, созданной классом в частном порядке. Чтобы добиться этого, я посмотрел наNSManagedObjectContextAPI в качестве справочника. E стьperform(block:() -> Void) метод, который может это сделать.

Это идет с шаблоном кода, который мне немного неудобен. Пользователю этого API необходимо выполнять вызовы объекта в блокеperform(block:() -> Void)метод. Есть ли более элегантное решение, в котором я могу заявить, что все методы и свойства ограничены этим конкретным потоком. Таким образом, по сути, пользователь может получить доступ к методам, но внутренняя операция выполняется в предполагаемом потоке.

Я знаю вариант, при котором я могу перейти к каждому методу и направить работу этого метода в предполагаемый поток. Но это дополнительные накладные расходы на написание кода отправки.

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)
Другие вопросы по тегам