diff --git a/Yep/Realm/Models.swift b/Yep/Realm/Models.swift index cb576cf6..7ff679e8 100644 --- a/Yep/Realm/Models.swift +++ b/Yep/Realm/Models.swift @@ -259,6 +259,11 @@ func groupWithGroupID(groupID: String, inRealm realm: Realm) -> Group? { return realm.objects(Group).filter(predicate).first } +func countOfUnreadMessagesInRealm(realm: Realm) -> Int { + let predicate = NSPredicate(format: "readed = false AND fromFriend.friendState != %d", UserFriendState.Me.rawValue) + return realm.objects(Message).filter(predicate).count +} + func messageWithMessageID(messageID: String, inRealm realm: Realm) -> Message? { if messageID.isEmpty { return nil diff --git a/Yep/ViewControllers/Conversation/ConversationViewController.swift b/Yep/ViewControllers/Conversation/ConversationViewController.swift index d0692e13..c09c2bf5 100644 --- a/Yep/ViewControllers/Conversation/ConversationViewController.swift +++ b/Yep/ViewControllers/Conversation/ConversationViewController.swift @@ -1147,16 +1147,19 @@ extension ConversationViewController: UICollectionViewDataSource, UICollectionVi // TODO: 需要更好的下载与 mark as read 逻辑:也许未下载的也可以 mark as read downloadAttachmentOfMessage(message) - markAsReadMessage(message, failureHandler: nil) { success in - dispatch_async(dispatch_get_main_queue()) { - let realm = Realm() - - if let message = messageWithMessageID(message.messageID, inRealm: realm) { - realm.write { - message.readed = true - } + // 防止未在此界面时被标记 + if navigationController?.topViewController == self { + markAsReadMessage(message, failureHandler: nil) { success in + dispatch_async(dispatch_get_main_queue()) { + let realm = Realm() - println("\(message.messageID) mark as read") + if let message = messageWithMessageID(message.messageID, inRealm: realm) { + realm.write { + message.readed = true + } + + println("\(message.messageID) mark as read") + } } } } diff --git a/Yep/ViewControllers/Conversations/ConversationsViewController.swift b/Yep/ViewControllers/Conversations/ConversationsViewController.swift index c6f3af72..0c50834e 100644 --- a/Yep/ViewControllers/Conversations/ConversationsViewController.swift +++ b/Yep/ViewControllers/Conversations/ConversationsViewController.swift @@ -17,6 +17,22 @@ class ConversationsViewController: UIViewController { var realm: Realm! + var unreadMessagesToken: NotificationToken? + var haveUnreadMessages = false { + didSet { + if haveUnreadMessages != oldValue { + if haveUnreadMessages { + navigationController?.tabBarItem.image = UIImage(named: "icon_chat_unread") + navigationController?.tabBarItem.selectedImage = UIImage(named: "icon_chat_active_unread") + + } else { + navigationController?.tabBarItem.image = UIImage(named: "icon_chat") + navigationController?.tabBarItem.selectedImage = UIImage(named: "icon_chat_active") + } + } + } + } + lazy var conversations: Results = { return self.realm.objects(Conversation).sorted("updatedAt", ascending: false) }() @@ -47,8 +63,9 @@ class ConversationsViewController: UIViewController { conversationsTableView.registerNib(UINib(nibName: cellIdentifier, bundle: nil), forCellReuseIdentifier: cellIdentifier) conversationsTableView.rowHeight = 80 - navigationController?.tabBarItem.image = UIImage(named: "icon_chat_unread") - navigationController?.tabBarItem.selectedImage = UIImage(named: "icon_chat_active_unread") + unreadMessagesToken = realm.addNotificationBlock { notification, realm in + self.haveUnreadMessages = countOfUnreadMessagesInRealm(realm) > 0 + } } override func viewDidAppear(animated: Bool) {