Как я могу перенести код NotificationCenter на параллелизм Swift 6?IOS

Программируем под IOS
Ответить
Anonymous
 Как я могу перенести код NotificationCenter на параллелизм Swift 6?

Сообщение Anonymous »

Я переношу класс NotificationManager в Swift 6. Этот класс представляет собой небольшую служебную оболочку NotificationCenter и имеет метод, который позволяет пользователям регистрировать уведомление, которое будет срабатывать, если только объект не равен определенному значению NSObject.
Например:

Код: Выделить всё

manager.registerObserver(for: name, forObject: nil, ignoreIfSentFrom: self) {
// run this code _only_ if the sender wasn't self
}
Метод выглядит следующим образом:

Код: Выделить всё

  private func registerObserver(_ name: NSNotification.Name, forObject object: AnyObject?,
ignoreIfSentFrom ignoredObject: NSObject, block: @Sendable @MainActor @escaping (Notification) -> ())
{
let newToken = NotificationCenter.default.addObserver(forName: name, object: object, queue: nil) { note in
guard (note.object as AnyObject) !== ignoredObject else { return }

Task { @MainActor in
block(note)
}
}

observerTokens.append(newToken)
}
Я получаю две ошибки, которые не могу понять, как устранить:
  • Код: Выделить всё

    Capture of 'ignoredObject' with non-Sendable type 'NSObject?' in a '@Sendable' closure
    (на охранной линии)
  • Код: Выделить всё

    Sending 'note' risks causing data races; this is an error in the Swift 6 language mode
    (for block(note))
Можно ли реализовать эту идею со строгим параллелизмом в Swift 6? Похоже, Notification не является ни Sendable, ни @MainActor, и поскольку у меня нет этого типа, я не понимаю, как заставить это работать.

Подробнее здесь: https://stackoverflow.com/questions/798 ... oncurrency
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»