Опубликовать `Счет операций » из OperationQueue внутри актера?

#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.
}
 

Просто помните, что вы находитесь вне субъекта внутри этого замыкания, поэтому вызовы, возможно, должны быть асинхронными внутри задачи.