From bb1d11e3017021658e602eb603d73e1e052d80e6 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Thu, 29 Oct 2015 16:43:25 +0800 Subject: [PATCH] refactor deleteConversation; directly delete deletedFeedConversation --- Yep/Realm/Models.swift | 108 ++++++++++-------- .../FeedConversationsViewController.swift | 58 ++++++---- 2 files changed, 95 insertions(+), 71 deletions(-) diff --git a/Yep/Realm/Models.swift b/Yep/Realm/Models.swift index 0ea03662..44c06afa 100644 --- a/Yep/Realm/Models.swift +++ b/Yep/Realm/Models.swift @@ -1058,6 +1058,61 @@ func updateUserWithUserID(userID: String, useUserInfo userInfo: JSONDictionary) // MARK: Delete +private func clearMessagesOfConversation(conversation: Conversation, inRealm realm: Realm) { + + let messages = conversation.messages + + // delete all media files of messages + + messages.forEach { deleteMediaFilesOfMessage($0) } + + // delete all mediaMetaDatas + + for message in messages { + if let mediaMetaData = message.mediaMetaData { + let _ = try? realm.write { + realm.delete(mediaMetaData) + } + } + } + + // delete all messages in conversation + + let _ = try? realm.write { + realm.delete(messages) + } +} + +func deleteConversation(conversation: Conversation, inRealm realm: Realm) { + + clearMessagesOfConversation(conversation, inRealm: realm) + + // delete conversation, finally + + let _ = try? realm.write { + + if let group = conversation.withGroup { + + if let feed = conversation.withGroup?.withFeed { + + feed.cascadeDelete() + } + + let groupID = group.groupID + + FayeService.sharedManager.unsubscribeGroup(groupID: groupID) + + leaveGroup(groupID: groupID, failureHandler: nil, completion: { + println("leaved group: \(groupID)") + }) + + realm.delete(group) + } + + realm.delete(conversation) + } +} + func tryDeleteOrClearHistoryOfConversation(conversation: Conversation, inViewController vc: UIViewController?, whenAfterClearedHistory afterClearedHistory: () -> Void, afterDeleted: () -> Void, orCanceled cancelled: () -> Void) { guard let realm = conversation.realm else { @@ -1066,58 +1121,11 @@ func tryDeleteOrClearHistoryOfConversation(conversation: Conversation, inViewCon } let clearMessages: () -> Void = { - - let messages = conversation.messages - - // delete all media files of messages - - messages.forEach { deleteMediaFilesOfMessage($0) } - - // delete all mediaMetaDatas - - for message in messages { - if let mediaMetaData = message.mediaMetaData { - let _ = try? realm.write { - realm.delete(mediaMetaData) - } - } - } - - // delete all messages in conversation - - let _ = try? realm.write { - realm.delete(messages) - } + clearMessagesOfConversation(conversation, inRealm: realm) } let delete: () -> Void = { - - clearMessages() - - // delete conversation, finally - - let _ = try? realm.write { - - if let group = conversation.withGroup { - - if let feed = conversation.withGroup?.withFeed { - - feed.cascadeDelete() - } - - let groupID = group.groupID - - FayeService.sharedManager.unsubscribeGroup(groupID: groupID) - - leaveGroup(groupID: groupID, failureHandler: nil, completion: { - println("leaved group: \(groupID)") - }) - - realm.delete(group) - } - - realm.delete(conversation) - } + deleteConversation(conversation, inRealm: realm) } // show ActionSheet before delete @@ -1153,5 +1161,5 @@ func tryDeleteOrClearHistoryOfConversation(conversation: Conversation, inViewCon afterDeleted() } - } + diff --git a/Yep/ViewControllers/FeedConversations/FeedConversationsViewController.swift b/Yep/ViewControllers/FeedConversations/FeedConversationsViewController.swift index 8b0fb6a0..9e11005a 100644 --- a/Yep/ViewControllers/FeedConversations/FeedConversationsViewController.swift +++ b/Yep/ViewControllers/FeedConversations/FeedConversationsViewController.swift @@ -148,38 +148,54 @@ extension FeedConversationsViewController: UITableViewDataSource, UITableViewDel if editingStyle == .Delete { - guard let conversation = feedConversations[safe: indexPath.row] else { + guard let conversation = feedConversations[safe: indexPath.row], feed = conversation.withGroup?.withFeed else { tableView.setEditing(false, animated: true) return } - tryDeleteOrClearHistoryOfConversation(conversation, inViewController: self, whenAfterClearedHistory: { [weak self] in + if feed.deleted { - tableView.setEditing(false, animated: true) - - // update cell - - if let cell = tableView.cellForRowAtIndexPath(indexPath) as? ConversationCell { - if let conversation = self?.feedConversations[safe: indexPath.row] { - let radius = min(CGRectGetWidth(cell.avatarImageView.bounds), CGRectGetHeight(cell.avatarImageView.bounds)) * 0.5 - cell.configureWithConversation(conversation, avatarRadius: radius, tableView: tableView, indexPath: indexPath) - } + guard let realm = conversation.realm else { + tableView.setEditing(false, animated: true) + return } - dispatch_async(dispatch_get_main_queue()) { - NSNotificationCenter.defaultCenter().postNotificationName(YepConfig.Notification.changedConversation, object: nil) - } + deleteConversation(conversation, inRealm: realm) - }, afterDeleted: { tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) - dispatch_async(dispatch_get_main_queue()) { - NSNotificationCenter.defaultCenter().postNotificationName(YepConfig.Notification.changedConversation, object: nil) - } + NSNotificationCenter.defaultCenter().postNotificationName(YepConfig.Notification.changedConversation, object: nil) - }, orCanceled: { - tableView.setEditing(false, animated: true) - }) + } else { + + tryDeleteOrClearHistoryOfConversation(conversation, inViewController: self, whenAfterClearedHistory: { [weak self] in + + tableView.setEditing(false, animated: true) + + // update cell + + if let cell = tableView.cellForRowAtIndexPath(indexPath) as? ConversationCell { + if let conversation = self?.feedConversations[safe: indexPath.row] { + let radius = min(CGRectGetWidth(cell.avatarImageView.bounds), CGRectGetHeight(cell.avatarImageView.bounds)) * 0.5 + cell.configureWithConversation(conversation, avatarRadius: radius, tableView: tableView, indexPath: indexPath) + } + } + + dispatch_async(dispatch_get_main_queue()) { + NSNotificationCenter.defaultCenter().postNotificationName(YepConfig.Notification.changedConversation, object: nil) + } + + }, afterDeleted: { + tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) + + dispatch_async(dispatch_get_main_queue()) { + NSNotificationCenter.defaultCenter().postNotificationName(YepConfig.Notification.changedConversation, object: nil) + } + + }, orCanceled: { + tableView.setEditing(false, animated: true) + }) + } } } }