iOS
105
NotificationCenter.default.post(name: Notification.Name("didFinish"), object: nil)
Этот код обращается к общему объекту
NotificationCenter.default
,
чтобы
опуб ликовать уведомление с именем
"didFinish"
. Это отличный способ, но он
редко используется в приложениях, распространяемых через App Store. Проб-
лема в хрупкости такой реализации, использующей простые строки. Объекты,
подписавшиеся на ваше уведомление, будут использовать его имя для приня
-
тия решений о дальнейших действиях. Если, допустим, вы решите изменить
имя уведомления на другое, например
didFinishDownload
, тогда объекты, под
-
писанные на
didFinish
, не получат его.
Эту проблему легко исправить. На самом деле метод
post
принимает не саму
строку – мы предварительно обертываем ее перечислением с именем
Notifica
tion.Name
. Чтобы решить нашу проблему, можно в классе или структуре создать
свойство с типом этого перечисления, использовать это свойство для
хранения
уже обернутой строки и передавать подписчикам уже это значение. Это из
-
менение позволяет любому объекту предварительно прочитать это свойство
перед подпиской, и любые изменения в значении свойства (например, в име
-
ни уведомления) будут автоматически обнаруживаться подписчиками. Вот как
это может выглядеть:
class SomeObject {
public static let didFinishNotification = Notification.Name("didFinish")
}
NotificationCenter.default.post(name: SomeObject.didFinishNotification, object: nil)
В нашем примере класс
SomeObject
определяет новое статическое свойство
с именем
didFinishNotification
, хранящее значение перечисления, которое мы
использовали в вызове
post
в первом примере.
Затем в вызове метода пуб-
ликации уведомлений
post
мы используем это
свойство вместо объявления
значения непосредственно. Это позволяет нам изменить имя уведомления
с didFinish на любое другое, например SomeObjectDidFinishNotification, чтобы
предотвратить конфликты имен, допустим.
Также возможно, и на практике это используется довольно часто, прикре
-
пить данные к уведомлению. Это можно сделать с
помощью другой версии
метода
post
, которая принимает дополнительный аргумент со словарем зна
-
чений:
NotificationCenter.default
.post(name: SomeObject.didFinishNotification, object: nil,
userInfo: ["downloadCount": 3])
В этом примере мы передаем словарь, содержащий ключ
"downloadCount"
со
значением
3
. Таким способом можно передавать любые данные, которые мож
-
но поместить в словарь (то есть если они соответствуют интерфейсу
Hashable
).
Например, вот как можно передать объект:
let anObject = SomeObject()
let count = 3
NotificationCenter.default
.post(name: SomeObject.didFinishNotification, object: nil,
userInfo: ["someObject": anObject, "downloadCount": count])
106
Передача
сообщений
Обратите внимание, что в своем примере мы снова использовали обычные
строки. Это упрощает иллюстрацию описываемых идей, но на практике этого
лучше избегать из-за хрупкости такой реализации. Мы можем исправить дан
-
ный недостаток, применив тот же прием, что использовался для устранения
проблем с именами уведомлений, – включив в класс свойства, соответствую
-
щие ключам, например:
class SomeObject {
...
}
// Инкапсулировать код уведомлений в расширение
extension SomeObject {
public static let didFinishNotification =
Notification.Name("SomeObjectDidFinishNotification")
public static let didFinishNotificationObjectKey = "someObjectKey"
public static let didFinishNotificationDownloadCountKey = "downloadCount"
}
NotificationCenter.default
.post(name: SomeObject.didFinishNotification, object: nil,
userInfo: [SomeObject. didFinishNotificationObjectKey: anObject,
SomeObject.didFinishNotificationDownloadCountKey: count])
Используя статические свойства для ключей в словаре, можно повысить без
-
опасность уведомлений на этапе компиляции и сделать код более стабильным.
Когда число уведомлений становится больше двух-трех, обычно принято вы
-
делять код в
расширение, как показано выше.
Теперь мы можем публиковать уведомления и посылать данные, но их пока
никто не принимает, поэтому поговорим о принимающей стороне. Для начала
посмотрим, как подписаться на эти уведомления.
Do'stlaringiz bilan baham: