Опубликовать `operationCount` из operationQueue внутри актора?

У меня есть актер:

      actor MyActor {
    
    let theQueue = OperationQueue()

    init() {

        _ = theQueue.observe(\OperationQueue.operationCount, options: .new) { oq, change in
            print("OperationQueue.operationCount changed: \(self.theQueue.operationCount)")
        }
        
    }

    ....

}

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

У меня была функция, которая могла бы это настроить, но на данный момент я использую self в этом инициализаторе выдает мне это предупреждение, которое в соответствии с этим:

https://forums.swift.org/t/proposal-actor-initializers-and-deinitializers/52322

скоро это превратится в ошибку.

Я получаю следующее предупреждение:

«Я» актера может быть захвачено только закрытием из инициализатора async.

Итак, как я могу вызвать издателя, на который другие модели могут отреагировать, чтобы опубликовать очередь операций? operationCount как это меняется?

1 ответ

Здесь снимать не нужно. 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.
}

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

Другие вопросы по тегам