From 42ac6322523d59904e602d26a1f8720df0492e93 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Mon, 7 Dec 2015 10:57:37 +0800 Subject: [PATCH 1/5] clear old messages --- Yep/Realm/Models.swift | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/Yep/Realm/Models.swift b/Yep/Realm/Models.swift index 0021ae99..837d87e8 100644 --- a/Yep/Realm/Models.swift +++ b/Yep/Realm/Models.swift @@ -1420,14 +1420,6 @@ private func clearMessagesOfConversation(conversation: Conversation, inRealm rea messages.forEach { $0.deleteAttachmentInRealm(realm) } - // delete all mediaMetaDatas - - for message in messages { - if let mediaMetaData = message.mediaMetaData { - realm.delete(mediaMetaData) - } - } - // delete all messages in conversation realm.delete(messages) @@ -1515,3 +1507,36 @@ func tryDeleteOrClearHistoryOfConversation(conversation: Conversation, inViewCon vc.presentViewController(deleteAlertController, animated: true, completion: nil) } +func clearOldObjects() { + + guard let realm = try? Realm() else { + return + } + + realm.beginWrite() + + // 7天前 + let oldThresholdUnixTime = NSDate(timeIntervalSinceNow: -(60 * 60 * 24 * 7)).timeIntervalSince1970 + + // User + + // Group + + // Message + + do { + let predicate = NSPredicate(format: "createdUnixTime < %f", oldThresholdUnixTime) + let oldMessages = realm.objects(Message).filter(predicate) + + oldMessages.forEach({ + $0.deleteAttachmentInRealm(realm) + realm.delete($0) + }) + } + + // Feed + + let _ = try? realm.commitWrite() +} + + From d43f693bb3a2dc9e01845ebf2e58f214528f2977 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Mon, 7 Dec 2015 11:28:30 +0800 Subject: [PATCH 2/5] clear noGroupFeeds & notJoinedFeeds --- Yep/AppDelegate.swift | 4 +++ Yep/Realm/Models.swift | 59 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/Yep/AppDelegate.swift b/Yep/AppDelegate.swift index 46b2a537..fc0e2437 100644 --- a/Yep/AppDelegate.swift +++ b/Yep/AppDelegate.swift @@ -117,6 +117,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate { println("Enter background") NSNotificationCenter.defaultCenter().postNotificationName(MessageToolbar.Notification.updateDraft, object: nil) + + clearUselessRealmObjects() } func applicationWillEnterForeground(application: UIApplication) { @@ -151,6 +153,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func applicationWillTerminate(application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + + clearUselessRealmObjects() } // MARK: APNs diff --git a/Yep/Realm/Models.swift b/Yep/Realm/Models.swift index 837d87e8..fd36cb0b 100644 --- a/Yep/Realm/Models.swift +++ b/Yep/Realm/Models.swift @@ -709,6 +709,15 @@ class FeedAudio: Object { return nil } + + func deleteAudioFile() { + + guard !fileName.isEmpty else { + return + } + + NSFileManager.removeMessageAudioFileWithName(fileName) + } } class FeedLocation: Object { @@ -767,6 +776,22 @@ class Feed: Object { realm.delete(socialWork) } + if let audio = audio { + + audio.deleteAudioFile() + + realm.delete(audio) + } + + if let location = location { + + if let coordinate = location.coordinate { + realm.delete(coordinate) + } + + realm.delete(location) + } + realm.delete(self) } } @@ -1507,16 +1532,15 @@ func tryDeleteOrClearHistoryOfConversation(conversation: Conversation, inViewCon vc.presentViewController(deleteAlertController, animated: true, completion: nil) } -func clearOldObjects() { +func clearUselessRealmObjects() { guard let realm = try? Realm() else { return } - realm.beginWrite() + println("do clearUselessRealmObjects") - // 7天前 - let oldThresholdUnixTime = NSDate(timeIntervalSinceNow: -(60 * 60 * 24 * 7)).timeIntervalSince1970 + realm.beginWrite() // User @@ -1525,9 +1549,14 @@ func clearOldObjects() { // Message do { + // 7天前 + let oldThresholdUnixTime = NSDate(timeIntervalSinceNow: -(60 * 60 * 24 * 1)).timeIntervalSince1970 + let predicate = NSPredicate(format: "createdUnixTime < %f", oldThresholdUnixTime) let oldMessages = realm.objects(Message).filter(predicate) + println("oldMessages.count: \(oldMessages.count)") + oldMessages.forEach({ $0.deleteAttachmentInRealm(realm) realm.delete($0) @@ -1536,6 +1565,28 @@ func clearOldObjects() { // Feed + do { + let predicate = NSPredicate(format: "group == nil") + let noGroupFeeds = realm.objects(Feed).filter(predicate) + + println("noGroupFeeds.count: \(noGroupFeeds.count)") + + noGroupFeeds.forEach({ + $0.cascadeDeleteInRealm(realm) + }) + } + + do { + let predicate = NSPredicate(format: "group != nil AND group.includeMe = false") + let notJoinedFeeds = realm.objects(Feed).filter(predicate) + + println("notJoinedFeeds.count: \(notJoinedFeeds.count)") + + notJoinedFeeds.forEach({ + $0.cascadeDeleteInRealm(realm) + }) + } + let _ = try? realm.commitWrite() } From ec34d2a48450e1f1e0a38a08022cf290ea7bf1af Mon Sep 17 00:00:00 2001 From: nixzhu Date: Mon, 7 Dec 2015 11:46:27 +0800 Subject: [PATCH 3/5] detail --- Yep/AppDelegate.swift | 2 -- Yep/Realm/Models.swift | 8 +++++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Yep/AppDelegate.swift b/Yep/AppDelegate.swift index fc0e2437..3441e6ca 100644 --- a/Yep/AppDelegate.swift +++ b/Yep/AppDelegate.swift @@ -117,8 +117,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { println("Enter background") NSNotificationCenter.defaultCenter().postNotificationName(MessageToolbar.Notification.updateDraft, object: nil) - - clearUselessRealmObjects() } func applicationWillEnterForeground(application: UIApplication) { diff --git a/Yep/Realm/Models.swift b/Yep/Realm/Models.swift index fd36cb0b..f23df69b 100644 --- a/Yep/Realm/Models.swift +++ b/Yep/Realm/Models.swift @@ -1550,7 +1550,7 @@ func clearUselessRealmObjects() { do { // 7天前 - let oldThresholdUnixTime = NSDate(timeIntervalSinceNow: -(60 * 60 * 24 * 1)).timeIntervalSince1970 + let oldThresholdUnixTime = NSDate(timeIntervalSinceNow: -(60 * 60 * 24 * 7)).timeIntervalSince1970 let predicate = NSPredicate(format: "createdUnixTime < %f", oldThresholdUnixTime) let oldMessages = realm.objects(Message).filter(predicate) @@ -1577,7 +1577,10 @@ func clearUselessRealmObjects() { } do { - let predicate = NSPredicate(format: "group != nil AND group.includeMe = false") + // 2天前 + let oldThresholdUnixTime = NSDate(timeIntervalSinceNow: -(60 * 60 * 24 * 2)).timeIntervalSince1970 + + let predicate = NSPredicate(format: "group != nil AND group.includeMe = false AND createdUnixTime < %f", oldThresholdUnixTime) let notJoinedFeeds = realm.objects(Feed).filter(predicate) println("notJoinedFeeds.count: \(notJoinedFeeds.count)") @@ -1590,4 +1593,3 @@ func clearUselessRealmObjects() { let _ = try? realm.commitWrite() } - From 8b030911eb234772131ea1d2d29619eb7a28dac8 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Mon, 7 Dec 2015 11:53:14 +0800 Subject: [PATCH 4/5] use group.cascadeDeleteInRealm if can --- Yep/AppDelegate.swift | 4 ++++ Yep/Realm/Models.swift | 12 ++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Yep/AppDelegate.swift b/Yep/AppDelegate.swift index 3441e6ca..77526496 100644 --- a/Yep/AppDelegate.swift +++ b/Yep/AppDelegate.swift @@ -117,6 +117,10 @@ class AppDelegate: UIResponder, UIApplicationDelegate { println("Enter background") NSNotificationCenter.defaultCenter().postNotificationName(MessageToolbar.Notification.updateDraft, object: nil) + + #if DEBUG + clearUselessRealmObjects() + #endif } func applicationWillEnterForeground(application: UIApplication) { diff --git a/Yep/Realm/Models.swift b/Yep/Realm/Models.swift index f23df69b..3c9ae6d0 100644 --- a/Yep/Realm/Models.swift +++ b/Yep/Realm/Models.swift @@ -1572,7 +1572,11 @@ func clearUselessRealmObjects() { println("noGroupFeeds.count: \(noGroupFeeds.count)") noGroupFeeds.forEach({ - $0.cascadeDeleteInRealm(realm) + if let group = $0.group { + group.cascadeDeleteInRealm(realm) + } else { + $0.cascadeDeleteInRealm(realm) + } }) } @@ -1586,7 +1590,11 @@ func clearUselessRealmObjects() { println("notJoinedFeeds.count: \(notJoinedFeeds.count)") notJoinedFeeds.forEach({ - $0.cascadeDeleteInRealm(realm) + if let group = $0.group { + group.cascadeDeleteInRealm(realm) + } else { + $0.cascadeDeleteInRealm(realm) + } }) } From 4314a014c9320b18634b3b0bb0773ad4c07464fe Mon Sep 17 00:00:00 2001 From: nixzhu Date: Mon, 7 Dec 2015 12:27:04 +0800 Subject: [PATCH 5/5] clear realStrangers --- Yep/Realm/Models.swift | 60 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 4 deletions(-) diff --git a/Yep/Realm/Models.swift b/Yep/Realm/Models.swift index 3c9ae6d0..5c1e1e75 100644 --- a/Yep/Realm/Models.swift +++ b/Yep/Realm/Models.swift @@ -177,6 +177,10 @@ class User: Object { return linkingObjects(Group.self, forProperty: "members") } + var createdFeeds: [Feed] { + return linkingObjects(Feed.self, forProperty: "creator") + } + var isMe: Bool { if let myUserID = YepUserDefaults.userID.value { return userID == myUserID @@ -184,6 +188,30 @@ class User: Object { return false } + + // 级联删除关联的数据对象 + + func cascadeDeleteInRealm(realm: Realm) { + + if let avatar = avatar { + + if !avatar.avatarFileName.isEmpty { + NSFileManager.deleteAvatarImageWithName(avatar.avatarFileName) + } + + realm.delete(avatar) + } + + if let doNotDisturb = doNotDisturb { + realm.delete(doNotDisturb) + } + + socialAccountProviders.forEach({ + realm.delete($0) + }) + + realm.delete(self) + } } // MARK: Group @@ -1542,10 +1570,6 @@ func clearUselessRealmObjects() { realm.beginWrite() - // User - - // Group - // Message do { @@ -1598,6 +1622,34 @@ func clearUselessRealmObjects() { }) } + // User + + do { + // 7天前 + let oldThresholdUnixTime = NSDate(timeIntervalSinceNow: -(60 * 60 * 24 * 7)).timeIntervalSince1970 + let predicate = NSPredicate(format: "friendState == %d AND createdUnixTime < %f", UserFriendState.Stranger.rawValue, oldThresholdUnixTime) + //let predicate = NSPredicate(format: "friendState == %d ", UserFriendState.Stranger.rawValue) + + let strangers = realm.objects(User).filter(predicate) + + // 再仔细过滤,避免把需要的去除了(参与对话的,有Group的,Feed创建着,关联有消息的) + let realStrangers = strangers.filter({ + if $0.conversation == nil && $0.belongsToGroups.isEmpty && $0.ownedGroups.isEmpty && $0.createdFeeds.isEmpty && $0.messages.isEmpty { + return true + } + + return false + }) + + println("realStrangers.count: \(realStrangers.count)") + + realStrangers.forEach({ + $0.cascadeDeleteInRealm(realm) + }) + } + + // Group + let _ = try? realm.commitWrite() }