Нативная разработка мобильных приложений


Передача сообщений подписчикам



Download 3,69 Mb.
Pdf ko'rish
bet70/228
Sana21.07.2022
Hajmi3,69 Mb.
#834838
1   ...   66   67   68   69   70   71   72   73   ...   228
Bog'liq
Нативная разработка мобильных приложений

Передача сообщений подписчикам
заинтересованным в их получении
Уведомления – это удобный встроенный механизм передачи сообщений в дру
-
гие части приложения, позволяющий ослабить связь между компонентами. 
Для получения сообщений с определенными именами объект должен подклю
-
читься к общему объекту, в котором другие объекты будут публиковать эти со
-
общения. К сообщениям могут прикрепляться дополнительные данные и пе
-
редаваться любым объектам в приложении, подписавшимся на их получение. 
В терминологии Cocoa Touch такие сообщения называются «уведомлениями», 
а в других языках и системах этот шаблон иногда называют pub/sub (публика
-
ция/подписка) или observer (наблюдатель). Эквивалентом такого общего объ
-
екта в Android является 
LocalBroadcastManager
.
Под «уведомлениями» мы подразумеваем объект 
Notification
. Еще большую не
-
разбериху вносит тот факт, что «уведомление» в iOS означает нечто совершенно 
иное, чем в Android, и скорее соответствует системным событиям.
Давайте начнем с публикации уведомлений. Имена уведомлений являются 
строками, поэтому опубликовать уведомление можно передачей самой прос-
той строки:


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])
Используя статические свойства для ключей в словаре, можно повысить без
-
опасность уведомлений на этапе компиляции и сделать код более стабильным. 
Когда число уведомлений становится больше двух-трех, обычно принято вы
-
делять код в расширение, как показано выше.
Теперь мы можем публиковать уведомления и посылать данные, но их пока 
никто не принимает, поэтому поговорим о принимающей стороне. Для начала 
посмотрим, как подписаться на эти уведомления.

Download 3,69 Mb.

Do'stlaringiz bilan baham:
1   ...   66   67   68   69   70   71   72   73   ...   228




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish