From 59655ca4b816b0b51cdc4e24205972d03e18dfbd Mon Sep 17 00:00:00 2001 From: Fin Date: Fri, 6 Dec 2024 14:52:21 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4Message=20=E7=9A=84=20isDelet?= =?UTF-8?q?ed=20=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Common/RealmConfiguration.swift | 25 ++++++++++++++++------- Controller/MessageListViewModel.swift | 17 ++------------- Controller/MessageSettingsViewModel.swift | 2 -- Model/Message.swift | 3 --- View/MessageTableViewCellViewModel.swift | 8 +++----- 5 files changed, 23 insertions(+), 32 deletions(-) diff --git a/Common/RealmConfiguration.swift b/Common/RealmConfiguration.swift index 50a283f..3ffaad8 100644 --- a/Common/RealmConfiguration.swift +++ b/Common/RealmConfiguration.swift @@ -14,13 +14,24 @@ let kRealmDefaultConfiguration = { let fileUrl = groupUrl?.appendingPathComponent("bark.realm") let config = Realm.Configuration( fileURL: fileUrl, - schemaVersion: 13, - migrationBlock: { _, oldSchemaVersion in - // We haven’t migrated anything yet, so oldSchemaVersion == 0 - if oldSchemaVersion < 1 { - // Nothing to do! - // Realm will automatically detect new properties and removed properties - // And will update the schema on disk automatically + schemaVersion: 14, + migrationBlock: { migration, oldSchemaVersion in + switch oldSchemaVersion { + case 0...13: + migration.enumerateObjects(ofType: Message.className()) { oldObject, newObject in + guard let obj = oldObject else { + return + } + guard let isDeleted = obj["isDeleted"] as? Bool else { + return + } + // 旧版软删除的数据,迁移到新版时硬删除掉,新版不再过滤 isDeleted 字段 + if isDeleted, let newObject { + migration.delete(newObject) + } + } + default: + break } } ) diff --git a/Controller/MessageListViewModel.swift b/Controller/MessageListViewModel.swift index c76bdd6..9948029 100644 --- a/Controller/MessageListViewModel.swift +++ b/Controller/MessageListViewModel.swift @@ -37,7 +37,6 @@ class MessageListViewModel: ViewModel, ViewModelType { private func getResults(filterGroups: [String?], searchText: String?) -> Results? { if let realm = try? Realm() { var results = realm.objects(Message.self) - .filter("isDeleted != true") .sorted(byKeyPath: "createDate", ascending: false) if filterGroups.count > 0 { results = results.filter("group in %@", filterGroups) @@ -171,10 +170,9 @@ class MessageListViewModel: ViewModel, ViewModelType { // 删除message input.itemDelete.drive(onNext: { [weak self] index in if var section = messagesRelay.value.first { - if let realm = try? Realm() { + if let realm = try? Realm(), let message = self?.results?[index] { try? realm.write { - let message = self?.results?[index] - message?.isDeleted = true + realm.delete(message) } } section.messages.remove(at: index) @@ -203,17 +201,7 @@ class MessageListViewModel: ViewModel, ViewModelType { return } - // 不再使用icecream 了 - // 所以需要手动删除 -// try? realm.write { -// for msg in messages { -// msg.isDeleted = true -// } -// } try? realm.write { - for msg in messages { - msg.isDeleted = true - } realm.delete(messages) } } @@ -227,7 +215,6 @@ class MessageListViewModel: ViewModel, ViewModelType { let groupFilter = input.groupTap.compactMap { () -> GroupFilterViewModel? in if let realm = try? Realm() { let groups = realm.objects(Message.self) - .filter("isDeleted != true") .distinct(by: ["group"]) .value(forKeyPath: "group") as? [String?] diff --git a/Controller/MessageSettingsViewModel.swift b/Controller/MessageSettingsViewModel.swift index 9fbcf93..692b24e 100644 --- a/Controller/MessageSettingsViewModel.swift +++ b/Controller/MessageSettingsViewModel.swift @@ -79,7 +79,6 @@ class MessageSettingsViewModel: ViewModel, ViewModelType { .map { _ in if let realm = try? Realm() { return realm.objects(Message.self) - .filter("isDeleted != true") .count } return 0 @@ -204,7 +203,6 @@ class MessageSettingsViewModel: ViewModel, ViewModelType { .compactMap { _ in if let realm = try? Realm() { let messages = realm.objects(Message.self) - .filter("isDeleted != true") .sorted(byKeyPath: "createDate", ascending: false) var arr = [[String: AnyObject]]() diff --git a/Model/Message.swift b/Model/Message.swift index b3490af..e792642 100644 --- a/Model/Message.swift +++ b/Model/Message.swift @@ -17,9 +17,6 @@ class Message: Object { @objc dynamic var group: String? @objc dynamic var createDate: Date? - // 设置为 true 后,将被IceCream自动清理 - @objc dynamic var isDeleted = false - override class func primaryKey() -> String? { return "id" } diff --git a/View/MessageTableViewCellViewModel.swift b/View/MessageTableViewCellViewModel.swift index f5539ac..8d842ac 100644 --- a/View/MessageTableViewCellViewModel.swift +++ b/View/MessageTableViewCellViewModel.swift @@ -19,7 +19,9 @@ enum MessageListCellDateStyle { } class MessageTableViewCellViewModel: ViewModel { + // 不要在删除消息后,再次使用这个对象,否则会crash let message: Message + var identity: String let title: BehaviorRelay let body: BehaviorRelay @@ -30,7 +32,7 @@ class MessageTableViewCellViewModel: ViewModel { init(message: Message) { self.message = message - + self.identity = message.id self.title = BehaviorRelay(value: message.title ?? "") self.body = BehaviorRelay(value: message.body ?? "") self.url = BehaviorRelay(value: message.url ?? "") @@ -76,10 +78,6 @@ extension MessageSection: AnimatableSectionModelType { extension MessageTableViewCellViewModel: IdentifiableType { typealias Identity = String - var identity: String { - return "\(self.message.id)" - } - override func isEqual(_ object: Any?) -> Bool { if let obj = object as? MessageTableViewCellViewModel { // 消息列表cell上显示的时间需要随着时间的变化而变化(1分钟前、2分钟前 ...),如果时间不一样的就需要刷新界面