Есть ли элегантный способ ограничить класс потоком?
У меня есть класс, который я хочу ограничить потоком. Чтобы быть точным, я хочу, чтобы методы возврата void были доступны в определенном потоке или последовательной очереди, созданной классом в частном порядке. Чтобы добиться этого, я посмотрел наNSManagedObjectContext
API в качестве справочника. 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)