#swift #actor #operationqueue
Вопрос:
У меня есть актер:
actor MyActor {
let theQueue = OperationQueue()
init() {
_ = theQueue.observe(OperationQueue.operationCount, options: .new) { oq, change in
print("OperationQueue.operationCount changed: (self.theQueue.operationCount)")
}
}
....
}
Я пытался заставить KVO затем инициировать какой-либо вызов издателя, на который другие модели в приложении могли бы подписаться и реагировать по мере необходимости при изменении количества операций.
У меня должна была быть функция, которая, возможно, настроила бы это, но на данный момент использование self
этого инициализатора дает мне это предупреждение, которое, согласно этому:
https://forums.swift.org/t/proposal-actor-initializers-and-deinitializers/52322
скоро это превратится в ошибку.
Предупреждение, которое я получаю, заключается в следующем:
«Я» актера может быть захвачено только закрытием из асинхронного инициализатора
Итак, как я могу вызвать издателя, на которого затем могут отреагировать другие модели, которые опубликуют очередь операций operationCount
по мере ее изменения?
Комментарии:
1. Пожалуйста, не вкладывайте ответ в вопрос. Вопрос должен быть вопросом. Если у вас есть альтернативный ответ, дайте его в качестве ответа .
2. Я подумал, что другим было бы полезно знать, так как в названии написано «опубликовать», и это ключевое слово, связанное с комбинированным подходом, который я в итоге использовал. Учитывая, что ответ Роба Нейпира кажется приемлемым в контексте, я не хотел публиковать ответ, который противоречил бы его. Мне бы хотелось иметь это дополнение, если бы я наткнулся на этот вопрос. Но это только мое мнение. Спасибо.
3. Это нормально , чтобы опубликовать альтернативный ответ. Это не противоречит существующему / принятому ответу. Вот как работает переполнение стека: оно собирает несколько ответов на отдельные вопросы. Вы должны дать свой ответ как ответ, чтобы он был полезным.
Ответ №1:
Вам не нужно захватывать self
здесь. observe
отправляет вам новое значение (в основном именно по этой причине):
_ = theQueue.observe(OperationQueue.operationCount, options: .new) { oq, change in
print("OperationQueue.operationCount changed: (change.newValue!)")
}
Также, oq
theQueue
если вам это нужно. Если вам нужно self
, типичный способ сделать это -:
observation = observe(.theQueue.operationCount, options: .new) { object, change in
// object is `self` here.
}
Просто помните, что вы находитесь вне субъекта внутри этого замыкания, поэтому вызовы, возможно, должны быть асинхронными внутри задачи.