refactor deleteConversation; directly delete deletedFeedConversation

This commit is contained in:
nixzhu
2015-10-29 16:43:25 +08:00
parent baf5d0b8f2
commit bb1d11e301
2 changed files with 95 additions and 71 deletions
+58 -50
View File
@@ -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()
}
}
@@ -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)
})
}
}
}
}