
ǰÑÔ
ÔÚ iOS ¿ª·¢ÖУ¬ÓÐÕâÑùÒ»¸ö³¡¾°£ºÄ³¼þÖØÒªµÄÊÂÇ鱨ÐëÁ¢¿ÌÈÃÓû§ÖªµÀ£¬ÉõÖÁ²»Ï§ÒÔ´ò¶ÏÓû§µ±Ç°²Ù×÷Ϊ´ú¼ÛÀ´Ç¿µ÷Õâ·ÝÖØÒªÐÔ¡£Õâ¾ÍÊÇ֪ͨ£¨Notifiations£©¡£Ä¿Ç°³£ÓõĿò¼ÜΪ
UserNotifications£¬ËüÖ÷ÒªÓÃÀ´ÔÚËøÆÁºÍÓ¦ÓýçÃæÍ¨¹ýµ¯´°À´ÏÔʾ֪ͨ¡£ÁíÒ»¸ö¿ò¼ÜÊÇ Notification
Center £¬ÒÔËüʵÏֵĿç object ֪ͨÒÔ¼°ÔÉúµÄ KVO(Key-Value-Observing)
ÊÇ iOS Öй۲ìÕßģʽµÄÖ÷ҪʵÏÖÊֶΡ£
±¾ÎÄÄÚÈÝ£º
UserNotifications ½éÉÜ
±¾µØÍ¨Öª£¨Local Notifications£©
Ô¶³Ì֪ͨ£¨Remote Notifications£©
¹Û²ìÕßģʽ£¨Observer Pattern£©
UserNotifications ½éÉÜ
UserNotifications ÊÇ iOS 10 ¸Õ¸ÕÒýÈëµÄȫпò¼Ü¡£ÓëÒÔÍù°æ±¾µÄ±¾µØÍ¨ÖªºÍÔ¶³Ì֪ͨ·Ö±ð´¦Àí²»Í¬£¬Õâ´ÎÆ»¹û°ÑÁ½ÕßµÄ
API ͳһ¡£´Ó´ËÒÔºó£¬ÎÞÂÛ´¦Àí±¾µØÍ¨Öª»¹ÊÇÔ¶³Ì֪ͨ£¬¶¼ÊÇÓà UserNotifications ¿ò¼Ü¡£
UserNotifications µÄÁ÷³ÌҲʮ·Ö¼òµ¥£¬Ö÷Òª·ÖÒÔÏ 4 ²½£º

UserNotifications Á÷³Ì
×¢²á
ͨ¹ýµ÷Óà requestAuthorization Õâ¸ö·½·¨£¬Í¨ÖªÖÐÐÄ»áÏòÓû§·¢ËÍ֪ͨÐí¿ÉÇëÇó¡£ÔÚµ¯³öµÄ
Alert Öеã»÷ͬÒ⣬¼´¿ÉÍê³É×¢²á¡£
´´½¨
Èç¹ûÊDZ¾µØÍÆËÍ£¬ÔòÔÚ AppDelegate ÖÐÉèÖÃÍÆËͲÎÊý£»Èç¹ûÊÇÔ¶³ÌÍÆËÍ£¬ÔòÎÞÐèÉèÖòÎÊý£¬ÍÆË͵ÄÄÚÈݺʹ¥·¢Ê±¼ä¶¼ÔÚÔ¶³Ì·þÎñÆ÷¶ËÅäÖá£
ÍÆËÍ
ÕâÒ»²½¾ÍÊÇϵͳ»òÕßÔ¶³Ì·þÎñÆ÷ÍÆËÍ֪ͨ¡£°éËæ×ÅÒ»ÉùÇå´àµÄÏìÉù£¨»ò×Ô¶¨ÒåµÄÉùÒô£©£¬Í¨Öª¶ÔÓ¦µÄUIÏÔʾµ½ÊÖ»ú½çÃæµÄ¹ý³Ì¡£
ÏìÓ¦
µ±Óû§¿´µ½Í¨Öªºó£¬µã»÷½øÈ¥»áÓÐÏàÓ¦µÄÏìӦѡÏî¡£ÈçÏÂͼ£º

ÀýÈç Instagram Õâ¸ö App £¬Óû§¿´µ½ËüµÄ֪ͨºóÓÐ3¸öÑ¡ÏһÊÇ Like , µã»÷Ö®ºó¾ÍÊǸøÄãÅóÓѵÄÕÕÆ¬µãÔÞ£»ÁíÒ»¸öÊÇ
Quick Reply£¬µã»÷Ö®ºó¿ÉÒÔÆÀÂÛÕÕÆ¬£»×îºóÊÇ View Post£¬µã»÷Ö®ºóÊǽøÈë Instagram
Ö÷ App ½øÐÐÕÕÆ¬ä¯ÀÀ¡£Óû§²»Í¬µÄÑ¡Ôñ¾ö¶¨ÁËÖ®ºóµÄ²Ù×÷£¬±ÊÕß³ÆÕâ¸ö¹ý³ÌÊÇ¶Ô Notification
µÄÏìÓ¦¡£
±¾µØÍ¨Öª
ÒòΪ֪ͨÊÇÕë¶ÔÕû¸ö App ¼¶±ðµÄ¹¦ÄÜ£¬ËùÒÔÒ»°ãÔÚ AppDelegate ÖÐÍê³É×¢²áºÍ´´½¨µÄ¹ý³Ì¡£´úÂëÈçÏ£º
/// ×¢²á UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { accepted, error in if !accepted { print("Notification access denied.") } }
/// ´´½¨
func scheduleNotification(at date: Date) {
/// ´¥·¢»úÖÆ
let calendar = Calendar(identifier: .gregorian)
let components = calendar.dateComponents(in: .current,
from: date)
let newComponents = DateComponents(calendar: calendar,
timeZone: .current, month: components.month, day:
components.day, hour: components.hour, minute:
components.minute)
let trigger = UNCalendarNotificationTrigger(dateMatching:
newComponents, repeats: false)
/// ֪ͨÄÚÈÝ
let content = UNMutableNotificationContent()
content.title = "Tutorial Reminder"
content.body = "Just a reminder to read your
tutorial over at Soapyigu's Swift30Projects!"
content.sound = UNNotificationSound.default()
/// ´«Èë²ÎÊý
let request = UNNotificationRequest(identifier:
"textNotification", content: content,
trigger: trigger)
/// ½«´´½¨ºÃµÄ֪ͨ´«Èë֪ͨÖÐÐÄ
UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
UNUserNotificationCenter.current().add(request)
{ error in
if let error = error {
print("Uh oh! We had an error: \(error)")
}
}
} |
ÔÚ´´½¨¹ý³ÌÖУ¬ÓÐÒÔϼ¸µãÖµµÃ×¢Ò⣺
´¥·¢»úÖÆ¡£Èç¹ûÊÇʱ¼ä´¥·¢£¬¾ÍÓà UNCalendarNotificationTrigger£»Èç¹ûÊǵص㴥·¢£¬¾ÍÓÃ
UNLocation?Notification?Trigger¡£
֪ͨÄÚÈÝ¡£³ýÁ˱êÌ⣨title£©¡¢ÄÚÈÝ£¨body£©¡¢ÉùÒô£¨sound£©Í⣬»¹¿ÉÒÔÌí¼Ó¸±±êÌ⣨subTitle£©ÉõÖÁÊÇͼƬ¡£Ìí¼ÓͼƬµÄʾÀý´úÂëÈçÏ£º
/// ½«Í¼Æ¬Ìí¼Óµ½Í¨ÖªÖÐ if let path = Bundle.main.path(forResource: "Swift", ofType: "png") {
/// ͨ¹ý±¾µØÍ¼Æ¬ Swift.png µÄ·¾¶´´½¨ URL
let url = URL(fileURLWithPath: path)
do {
let attachment = try UNNotificationAttachment(identifier:
"Swift", url: url, options: nil)
/// ÉèÖÃÄÚÈݵĸ½¼þ£¬½«Í¼Æ¬´«Èë
/// Äã¿ÉÒÔ´«¶à¸öͼƬ½øÈ룬µ«Ö»»áÏÔʾµÚÒ»¸öͼƬ
/// µ±È»ÄãÒ²¿ÉÒÔ¸ù¾Ý²»Í¬Çé¿öÏÔʾ²»Í¬Í¼Æ¬
content.attachments = [attachment]
} catch {
print("The attachment was not loaded.")
}
} |
Identifier¡£Ò»¸ö App ¿ÉÄÜÓжàÖÖ±¾µØÍ¨Öª£¬ËüÃÇÖ®¼äÊÇͨ¹ý Identifier ½øÐÐÇø·ÖµÄ¡£
½«´´½¨ºÃµÄ֪ͨ´«Èë֪ͨÖÐÐÄ¡£¶à¸ö Notifications Ö®¼äÓÐÏȺó˳Ðò£¬ËüÃÇÅųɶÓÁÐÔÚ֪ͨÖÐÐÄÖС£ÕâÀïÎÒÃÇΪÁË·½±ãÑÝʾ£¬É¾³ýÁËÒÔǰËùÓеÄ֪ͨ¡£
Íê³ÉÁË×¢²áºÍ´´½¨£¬ÎÒÃÇÖ»ÒªÔÚºÏÊʵÄʱ¼äÈÃÏµÍ³ÍÆËÍ֪ͨ¼´¿É¡£´úÂëÖбíÏÖΪÔÚij¸öʱ¼äµãµ÷ÓÃscheduleNotification(date)¡£Ö®ºóÎÒÃǾͿÉÒÔ¿´µ½ÏàÓ¦µÄ֪ͨµ¯³ö£º
Ò»°ãÇé¿öÏÂÓû§»áµã»÷ֱ֪ͨ½Ó½øÈë App ²é¿´¡£¼ÙÈçҪʵÏÖÔÚ֪ͨ³öÏÖʱ¿ìËÙ²Ù×÷£¬±ÈÈç¹ý10·ÖÖÓÔÙÌáÐÑÎÒÕâÑùµÄÑ¡ÏÎÒÃÇÓÖ¸ÃÔõô×öÄØ£¿ÕâʱºòÎÒÃÇÒýÈëUNNotificationActionºÍUNNotificationCategory¡£
UNNotificationAction: ÏìӦ֪ͨµÄµ¥¸ö¾ßÌå²Ù×÷¡£ÀýÈçÖ±½Ó¸øÏà¹ØÍÆËÍÐÅÏ¢µãÔÞ¡£
UNNotificationCategory: ÏìÓ¦²Ù×÷¶ÔÓ¦µÄÀà±ð¡£Ï൱ÓÚÊǶà¸ö UNNotificationAction
¹¹³ÉµÄȺ×飬±íÃ÷Ò»ÀàÏìÓ¦²Ù×÷¡£
ÏÂÃæÒ»¶Î´úÂë¾ÍÊÇ´´Á¢ÁËÒ»¸ö "Remind me later" µÄ UNNotificationAction
ÏìÓ¦²Ù×÷£¬²¢½«Æä¼ÓÈëµ½ "normal" µÄ
UNNotificationCategory Àà±ðÖ®ÖС£
let action = UNNotificationAction(identifier: "remindLater", title: "Remind me later", options: []) let category = UNNotificationCategory(identifier: "normal", actions: [action], intentIdentifiers: [], options: []) UNUserNotificationCenter.current().setNotificationCategories([category]) |
ÓÐÁËÉÏÃæ´úÂ룬µ±Óû§µã»÷֪ͨ£¬ÎÒÃǾÍÄÜ¿´µ½ÏàÓ¦µÄ¿ì½Ý²Ù×÷¡£ÄÇôÓû§µã»÷ ¡°Remind me later¡±
£¬ÎÒÃǸÃÈçºÎÔÚ App ÖÐÉèÖöÔÓ¦µÄ²Ù×÷£¬ÈÃϵͳÔÚ10·ÖÖÓºóÔÙ´ÎÍÆËÍÏìÓ¦Í¨ÖªÄØ£¿

ºÜ¼òµ¥£¬ÎÒÃÇÖ»ÒªÔÚUNUserNotificationCenterDelegate ÐÒéÖÐʵÏÖuserNotificationCenter(_:didReceive:withCompletionHandler:)
¡£µ±Óû§µã»÷֪ͨѡÏîʱ£¬Õâ¸ö·½·¨×Ô¶¯±»µ÷Óá£ÕâÀïÎÒÃÇͨ¹ý identifier À´ÅжϾßÌåÊÇÄÄÒ»¸öÑ¡Ïî±»µã»÷£¬ÔÙµ÷ÓöÔÓ¦ÏìÓ¦·½·¨¼´¿É¡£
extension AppDelegate: UNUserNotificationCenterDelegate { func userNotificationCenter (_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { if response.actionIdentifier == "remindLater" { let newDate = Date(timeInterval: 600, since: Date()) scheduleNotification(at: newDate) } } } |
Ô¶³Ì֪ͨ
ÔÙ½Ó´¥Ô¶³Ì´úÂëµÄ¾ßÌåʵÏÖ֮ǰ£¬ÎÒÃÇÏÈÀ´¿´¿´Ô¶³Ì֪ͨµÄÔÀí£º

Ô¶³Ì֪ͨ
App Ïò iOS ϵͳÉêÇëÍÆËÍȨÏÞ
iOS ϵͳÏò APNs(Apple Push Notification Service) ÇëÇóÊÖ»ú device
token£¬²¢¸æËß App£¬ÄܽÓÊÜÍÆË͵Ä֪ͨ¡£
App ½«ÊÖ»úµÄ device token ´«¸øºó¶Ë
ºó¶ËÏò APNs ÍÆËÍ֪ͨ
APNs ½«ÏìÓ¦Í¨ÖªÍÆË͸øÏìÓ¦ÊÖ»ú
´ÓÒÔÉÏÁ÷³ÌÎÒÃÇ¿ÉÒÔ¿´³ö£¬APNs ÔÚÕâÀïÆô¶¯Á˼à¹ÜÕߺÍÍйÜÕßµÄ×÷Óã¬ÎÞÂÛÊÇÇëÇó»¹ÊÇÍÆËͶ¼Òª¾¹ý APNs¡£Ò²¾ÍÊÇ˵£¬ËùÓеÄÍÆËͶ¼±ØÐë°´ÕÕ
APNs µÄÓÎÏ·¹æÔòÀ´¡£
ÓÐÈ˵½ÕâÀïÒªÎÊÁË£¬ËùÓÐÍÆËͶ¼Ö¸Íû APNs£¬ÄÇÁ÷Á¿ÄÇô´ó£¬APNs ±ÀÁËÔõô°ì£¿
ÕâȷʵÊÇÕâ¸öϵͳµÄÒ»¸ö±×¶Ë£¬¾ÍÊÇñîºÏ¶ÈÌ«¸ß£¬¹ýÓÚÖ¸Íû APNs ºÜÈÝÒ×Ôì³Éµ¥µã¹ÊÕÏ¡£ËùÒÔ£¬Æ»¹ûÔÚ iOS
10 ÒÔǰ£¬¶ÔÓÚÔ¶³Ì֪ͨµÄÄÚÈÝ£¬×öÁËÒÔÏÂÏÞÖÆ£º
In iOS 8 and later, the maximum size allowed for a
notification payload is 2 kilobytes; Apple Push Notification
service refuses any notification that exceeds this limit.
(Prior to iOS 8 and in OS X, the maximum payload size
is 256 bytes.)
¾ÍÊÇ˵£¬×î¶à´« 2 KB ֪ͨ¡£ÕâÑù¼´Ê¹ 1 ÃëÖÓÄÚÓÐ 100 Íò¸öÔ¶³ÌÍÆËÍͬʱ·¢Éú£¬Ò²¾Í 2 GB¡£Õâ¶ÔÓÚÒ»¸ö´ó¹«Ë¾À´ËµºÁÎÞѹÁ¦¡£
ºóÀ´ÔÚ iOS 10 ÖУ¬Æ»¹ûÒýÈëÁË Notification Content Extension ºÍ
Notification Service Extension£¬Õâʱºò¾Í¿ÉÒÔÐÞ¸ÄÔÀ´µÄ notification
ÄÚÈÝÁË£¬±ÈÈçÌí¼Ó¶àýÌåÎļþÖ®Àà¡£½²ÕâÁ½¸ö extension µÄÎÄÕÂÌ«¶à£¬±ÊÕßÕâÀï²»×÷׸Êö£¬Ö»ÌṩÒÔÏÂÔÀíͼһÕÅ¡£

ÏÂÃæÎÒÃÇÀ´¿´Ï¾ßÌåÔõôʵÏÖ¡£Ô¶³ÌÍÆËÍÓë±¾µØÍÆËͲ»Í¬ÔÚÓÚ£¬ÔÚ×¢²á֪ͨǰ£¬ÏÈÒªÉèÖà App ʹÆäÔÊÐíÔ¶³Ì֪ͨ¡£¾ßÌå×ö·¨¾ÍÊÇÈ¥
App Settings -> Capabilities -> Push Notifications£¬´ò¿ª
Push Notificaitons¡£

½ÓמÍÊÇÀϲ½Öè×¢²á¡£×¢ÒⲻͬµÄÊÇÕâ´ÎҪ˵Ã÷ÊÇÔ¶³Ì֪ͨ¡£´úÂëÈçÏ£º
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { accepted, error in if !accepted { print("Notification access denied.") } } /// ×¢²áÔ¶³Ì֪ͨ£¬´Ë´¦Óë±¾µØÍ¨Öª²»Í¬ application.registerForRemoteNotifications() |
Ô¶³Ì֪ͨµÄÄÚÈÝÓÉÔ¶³Ì·þÎñÆ÷¾ö¶¨£¬±¾µØÎÞÐè´´½¨¡£·þÎñÆ÷¶ËÐèÒªÒÔϼ¸¸ö¹Ø¼üÊý¾ÝÀ´È·È϶ÔÖ¸¶¨µÄÊÖ»ú½øÐÐÍÆËÍ£º
Device Token: APNs ÓÃÀ´È·ÈϾ¿¾¹ÊÇÄĄ̈»úÆ÷£¬Äĸö AppµÄ²ÎÊý¡£Ëü¿ÉÒÔͨ¹ýÒÔÏ´úÂë»ñÈ¡¡£
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { /// ½« device token ת»¯Îª×Ö·û´® let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)}) /// ½« device token ´òÓ¡µ½ console ÀïÃæ print("APNs device token: \(deviceTokenString) } |
¿ª·¢ App µÄÕýÈ·×ö·¨ÊÇ°Ñ Device Token ·¢Ë͵½·þÎñÆ÷¶Ë£¬ÕâÀïΪÁËÑÝʾ·½±ã£¬¾ÍÖ±½Ó´òÓ¡³öÀ´ÁË¡£Device
Token ´ó¸Å³¤ÏÂÃæÕâÑù£º
5311839E985FA01B56E7AD74334C0137F7D6AF71A22745D0FB50DED665E0E882 |
Key ID: ºǫ́·þÎñÆ÷·¢ËÍ֪ͨʱ£¬ APNs ¶ÔÆäµÄÈÏÖ¤ºÅÂë¡£ËüÐèÒªÄãÈ¥¿ª·¢ÕßÖÐÐÄ×¢²á APNs Auth
Key¡£Ëü»á²úÉúÒ»¸ö .p8 Îļþ£¬Key ID ¾ÍÔÚÆäÖС£

APNs Auth Key
Team ID: Äã Apple ID ¶ÔÓ¦µÄºÅÂë¡£¿ÉÒÔÔÚ App Settings -> Bundle
Identifier ÀïÕÒµ½¡£
ÕâÑù·þÎñÆ÷¾Í¿ÉÒÔÏòÄãµÄÊÖ»ú·¢ËÍ֪ͨÁË¡£¼ÓÈëÏìÓ¦²Ù×÷£¬Í¬ÑùÊǽèÖúUNNotificationActionºÍUNNotificationCategory
£¬²¢µ÷ÓÃuserNotificationCenter(_:didReceive:withCompletionHandler:)£¬Óë±¾µØÍÆË͵ÄÏìÓ¦´¦ÀíÊÇһģһÑùµÄ¡£
¹Û²ìÕßģʽ
¹Û²ìÕßģʽÊÇÉè¼ÆÄ£Ê½ÖеÄÒ»ÖÖ£¬¾ÍÊÇ˵һ¸ö¶ÔÏóµ±×ÔÉíijЩ״̬·¢Éú±ä»¯µÄʱºò£¬×ÔÉí·¢ÉúÏàÓ¦²Ù×÷»ò֪ͨ¸øÁíÒ»¸ö¶ÔÏó¡£¶ÔÏóÖ®¼äÎÞÐèÓÐÖ±½Ó»ò¼ä½ÓµÄ¹ØÏµ¡£ÕâÖÖÉè¼ÆÄ£Ê½µÄ×î´óµÄºÃ´¦ÊÇÔÚÓÚ½âñî¡£ÒòΪÁ½¸ö¶ÔÏó¿ÉÒԷֱ𵥶ÀÉè¼Æ£¬Ö»ÐèÔÚÌØ¶¨Çé¿öÏÂ֪ͨ¶Ô·½¼´¿É¡£
ÏÂÃæÇë¿´Ò»µÀÃæÊÔÌ⣺Çë×ÔÐÐÉè¼Æ Swift µÄ Notification API£¬Ê¹ÆäÄܹ»ÊµÏÖ iOS
ÖеĹ۲ìÕßģʽ¡£
Äõ½ÕâµÀÌâÄ¿£¬ÎÒÃÇÊ×ÏÈÒª·ÖÎö Notification API ¶ÔÓÚ¹Û²ìÕßÄ£Ð͵ÄʹÓó¡¾°£¬Î޷ǾÍÊÇÁ½ÖÖ£º¿ç
object ֪ͨ£¬ÒÔ¼° KVO£¨Key-Value-Observing£©¡£
¿ç object ֪ͨÒÔ¼° NotificationCenter Éè¼Æ
Ê×ÏÈÎÒÃÇÀ´¿´¿ç object ֪ͨ¡£Ò»¸ö×î¼òµ¥µÄÓ¦Óó¡¾°£¬µ±Ò»¸ö ViewController ³õʼ»¯Ê±£¬ËüҪ֪ͨ
Network ²¿·ÖÈ¥ÏÂÔØÏàÓ¦µÄͼƬÒÔÌî³ä¶ÔÓ¦µÄ UIImageView¡£ËùÒÔÁ÷³ÌÈçÏ£º
Network ×¢²á¹Û²ì ViewController ³õʼ»¯ÐÐΪ
ViewController ·¢Éú³õʼ»¯ÐÐΪ£¬²¢·¢³öÏàӦ֪ͨ
Network µÃµ½Í¨Öª£¬¹Û²ìµ½ ViewController ÐÐΪµÄ·¢Éú
Network ¸ù¾Ý֪ͨ£¬µ÷Óà downloadImage ·½·¨
¸ù¾ÝÒÔÉÏÁ÷³Ì£¬ÎÒÃÇ·¢ÏÖÕâÖÖÂß¼ÊÇ objects Ö®¼äµÄÐźŴ«µÝºÍ½ÓÊÕ¹ý³Ì¡£±È½ÏºÃµÄÉè¼Æ·½·¨Êǵ¥¶ÀÉè¼ÆÒ»¸ö
Notification Àà±ð£¬ËüÏ൱ÓÚÊÇÒ»¸ö֪ͨµ÷¶ÈÖÐÐÄ£¬´¦ÀíÈÎÒâ objects Ö®¼äµÄ֪ͨ£¬¶ø²»Ó°Ïì
objects ±¾ÉíµÄÆäËû²Ù×÷¡£ËùÒÔÎÒÃÇÉè¼Æ³öÁË NotificationCenter Õâ¸öÀà±ð£¬ËüÓÐÕâÁ½¸ö²Ù×÷£º
class NotificationCenter {
/* ×¢²á¹Û²ì
* observer£ºËµÃ÷ËÊǹ۲ìÕߣ¬´ËÀýÖÐÊÇ Network
* selector£ºÍ¨Öª·¢Éúºó¹Û²ìÕßµ÷Ó÷½·¨£¬´ËÀýÖÐΪ func downloadImage(url)
* notificationName£ºÍ¨ÖªÃû³Æ£¬ÓÃÀ´Ê¶±ð¾ßÌå֪ͨ
* object£ºÐÅÏ¢·¢ËÍÕߣ¬Èç¹ûΪ nil Ôò±íʾÈκη¢ËÍÕßÐÅÏ¢¶¼½ÓÊÜ£¬´ËÀýÖÐΪ ViewController
*/
func add(observer: Any, selector: Selector, notificationName:
String, object: Any?)
/* ·¢ËÍ֪ͨ
* notificationName£ºÍ¨ÖªÃû³Æ£¬ÓÃÀ´Ê¶±ð¾ßÌå֪ͨ£¬ÓëÉÏÃæµÄ×¢²á¹Û²ì¶ÔÓ¦
* object£ºÐÅÏ¢·¢ËÍÕߣ¬´ËÀýÖÐΪ ViewController
* userInfo£ºÌṩ¸ø¹Û²ìÕßµÄÐÅÏ¢£¬´ËÀýÖÐΪÐèÒªÏÂÔØÍ¼Æ¬µÄ URL£¬ÒÔ¼°¶ÔÓ¦µÄImageView
*/
func post(notificationName: String, object: Any?
, userInfo:[AnyHashable : Any]? = nil)
} |
ÓÉÓÚÊÇ¿ç object Ö®¼äµÄ֪ͨ£¬ËùÒÔ¿ÉÖª´ËÀà֪ͨ¾ßÓÐÒ»°ãÐÔ£¬¹Ê¶ø NotificationCenter
Éè¼ÆÎªµ¥Àý±È½ÏºÃ£º
class var default: NotificationCenter { get } |
×îºó»¹Òª×¢ÒâÒ»¸öÎÊÌ⣬¾ÍÊǵ±¹Û²ìÕß±»»ØÊÕµÄʱºò£¬ÎÒÃÇÒ»¶¨Òª³·Ïú¹Û²ì£¬·ñÔò»á·¢Éú֪ͨ·¢ÏòÒ»¸ö nil ÀàµÄÇé¿ö£¬µ¼ÖÂ
App ±ÀÀ£¡£ÓÚÊÇÎÒÃÇÕâÑùÉè¼Æ£º
func remove(observer: Any) |
È»ºó½«ËüÌí¼ÓÔÚÀà deinit ÖУº
deinit { remove(observer: self) } |
Ã²ËÆÎÒÃÇÒѾÉè¼ÆºÃÁËÕë¶Ô¿ç object µÄ×î¼òµ¥ API¡£¶ÔÕÕһϠApple ¹Ù·½µÄ NotificationCenter
API£¬·¢ÏÖȷʵҲÊÇÕâ¸ö˼·¡£²»¹ýËûÃÇÉè¼ÆµÄ¸üÈ«Ãæ¿É¿¿£¬ÕâÀï´ó¼Ò¿ÉÒÔ×ÔÐбȽϡ£
KVO
ÎÒÃÇÀ´¿´µÚ¶þ¸öÇé¿ö£¬¾ÍÊÇ KVO -- ¼üÖµ¹Û²ì¡£
¹ËÃû˼Ò壬¼üÖµ¹Û²ì¾ÍÊÇ˵µ±Ä³¸öÊôÐÔ·¢Éú±ä»¯£¬Æä¶ÔÓ¦µÄÖµÒ²·¢Éú±ä»¯¡£ËüÒ»°ãÓÃÓÚµ¥¸ö object ÄÚ²¿µÄÇé¿ö¡£¾Ù¸ö¾ßÌåµÄÀý×Ó£¬ViewController
Ò»¿ªÊ¼ UIImageView ûÓÐͼƬµÄʱºò£¬ÎÒÃÇÓà activityIndicator ÏÔʾ¼ÓÔØ×´Ì¬£¬µ±
Network ÏÂÔØºÃͼƬ²¢¸ø UIImageView ¸³ÖµÖ®ºó£¬ÎÒÃÇÍ£Ö¹ activityIndicator
µÄ¼ÓÔØ×´Ì¬¡£Ò²¾ÍÊÇ˵ÎÒÃǹ۲ì image Õâ¸öÊôÐÔ£¬µ±ËüÓÉ nil ±ä³É·Ç nil ʱ£¬³ÌÐò×÷³ö¹Ø±Õ activityIndicator
¶¯»µÄÏàÓ¦²Ù×÷

ËùÒÔ»ù±¾Á÷³ÌÈçÏ£º
ViewController ¸ø UIImageView Ìí¼Ó activityIndicator£¬Æô¶¯¶¯»Ð§¹û
ViewController ¹Û²ì UIImageView µÄ image ÊôÐÔ
ViewController ͨ¹ýÉÏÃæÌáµ½µÄ¿ç object ֪ͨ£¬´Ó Network ÀïÏÂÔØ image£¬²¢¸ø
UIImageView ¸³Öµ
ViewController ¹Û²ìµ½ UIImageView µÄ image ÊôÐÔÒѾ±»¸³Öµ£¬ËùÒÔÆô¶¯ÏàÓ¦·½·¨£¬¹Ø±Õ
activityIndicator µÄ¶¯»
ÕâÀïÎÒÃÇ¿ÉÒÔ¿´³öÀ´£¬ÕâÊÇÕë¶Ôµ¥¸ö object µÄij¸öÊôÐԱ仯¶øÉè¼Æ³öÀ´µÄ֪ͨ¿ò¼Ü¡£ËùÒÔÎÒÃDz»·ÁÓà extension
µÄÐÎʽ¶Ô NSObject Ìí¼Ó֪ͨ·½·¨¡£
extension NSObject { /* ×¢²á¹Û²ì * observer£ºËµÃ÷ËÊǹ۲ìÕߣ¬´ËÀýÖÐÊÇ UIImageView * property: Ö¸³ö±»¹Û²ìµÄÊôÐÔ£¬´ËÀýÖÐÊÇ UIImageView ÖÐµÄ image * options£ºÍ¨ÖªÖÐÓ¦¸Ã´«µÝµÄÐÅÏ¢£¬±ÈÈç UIImageView ÖÐÐ嵀 image ÐÅÏ¢ */ func add?Observer(observer: NSObject, property: String, ?options: ObservingOptions)
/* ÏìÓ¦¹Û²ì
* property: Ö¸³ö±»¹Û²ìµÄÊôÐÔ£¬´ËÀýÖÐÊÇ UIImageView ÖÐµÄ image
* object: ¹Û²ìÊôÐÔ¶ÔÓ¦µÄ object£¬´ËÀýÖÐÊÇ UIImageView
* change: ±íÃ÷ÊôÐÔµÄÏàÓ¦±ä»¯£¬Èç¹û±íʾÈκα仯¶¼¿ÉÒÔ½ÓÊÜ£¬¿ÉÒÔ´«Èë nil
*/
func observeValue(forProperty property: String,
ofObject object: Any,
change: [NSKeyValueChangeKey : Any]?)
} |
ͬÊDz»ÒªÍü¼Ç deinit µÄʱºò removeObserver£¬·ÀÖ¹ App ±ÀÀ£¡£¶Ô±È Apple
¹Ù·½µÄ addObserver API ºÍ observeValue API£¬ÎÒÃÇ·¢ÏÖÆ»¹û»¹ÒýÈëÁËÒ»¸ö²ÎÊýcontextÀ´¸ü¼ÓÁé»îµÄ´¦Àí֪ͨ¹Û²ì»úÖÆ¡£Äã¿ÉÒÔ¶¨Ò岻ͬµÄ
context ²¢¸ù¾ÝÕâЩ context À´¶ÔÊôÐԱ仯×ö³ö´¦Àí¡£±ÈÈçÏÂÃæÕâÑù£º
let myContext = UnsafePointer<()>()
observee.addObserver(observer, forKeyPath: ¡,
options: nil, context: myContext)
override func observeValueForKeyPath(keyPath:
String!, ofObject object: AnyObject!, change:
[NSObject : AnyObject]!, context: UnsafePointer<()>)
{
if context == myContext {
¡
} else {
super.observeValueForKeyPath(keyPath, ofObject:
object, change: change, context: context)
}
} |
×ܽá
iOS 10ÖÐÆ»¹ûµÄ±¾µØÍÆËͺÍÔ¶³ÌÍÆËÍ API ´ïµ½Á˸߶Èͳһ£¬¶¼Ê¹Óà UserNotifications
Õâ¸ö¿ò¼ÜÀ´ÊµÏÖ£¬Ñ§Ï°ÇúÏß´ó·ùϽµ¡£¹¦ÄÜÒ²µÃµ½ÁË´ó·ù¶ÈÀ©Õ¹£¬¶àýÌåÎļþÌí¼Ó¡¢À©Õ¹°ü¡¢·ÖÀà±ðÏìÓ¦¡¢3D Touch
¶¼Ê¹µÃÍÆË͹¦Äܸü¼ÓÁé»î¡£
ÖÁÓÚÆ»¹û×Ô¼ºÉè¼ÆµÄ KVO ºÍ NotificationCenter »úÖÆ£¬±ÊÕßÈÏΪÓкܴóµÄ¾ÖÏÞÐÔ¡£ÒòΪ¶ÔÓ¦µÄ֪ͨºÍÏàÓ¦´úÂë¶ÎÖ®¼äÓÐÒ»¶¨¾àÀ룬´úÂëÁ¿ºÜ´óµÄʱºò·Ç³£ÈÝÒ×ÕÒ²»µ½¶ÔÓ¦µÄÏàÓ¦¡£Í¬Ê±ÕâÖÖ¹Û²ìÕßģʽÓÖÄÑÒÔ²âÊÔ£¬´úÂëά»¤ºÍÖÊÁ¿ºÜÄѵõ½±£Ö¤¡£ÕýÊÇÒòΪÕâЩÔÒò£¬ÏìӦʽ±à³Ì²ÅÈÕ½¥ÐËÆð£¬´ó¼Ò²»·ÁÈ¥¿´¿´
RxSwift ºÍ ReactCocoa£¬Æä¶ÔÓ¦µÄ MVVM ¼Ü¹¹Ò²ÔÚϵͳ½âñîÉÏÒªÓÅÓÚÔÉúµÄ MVC¡£
|