Skip to content

Commit 0fc8a8d

Browse files
committed
异步同步数据到Widget,减少APP启动时间
1 parent ce3eabe commit 0fc8a8d

4 files changed

Lines changed: 27 additions & 9 deletions

File tree

Bark/AppDelegate+Realm.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ extension AppDelegate {
138138
realm.add(message, update: .all)
139139
}
140140
}
141-
WidgetHistorySnapshotStore.shared.syncFromMessages(realm.widgetSnapshotItems())
141+
WidgetHistorySnapshotStore.shared.refreshFromRealmAsync()
142142
} catch {
143143
// 一般不会失败,真失败了算你小子运气差
144144
}

Bark/AppDelegate.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
127127
try? realm.write {
128128
realm.delete(message)
129129
}
130-
WidgetHistorySnapshotStore.shared.syncFromMessages(realm.widgetSnapshotItems())
130+
WidgetHistorySnapshotStore.shared.refreshFromRealmAsync()
131131
}
132132

133133
completionHandler(.newData)

Common/WidgetHistorySnapshotStore.swift

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,16 @@
66
//
77

88
import Foundation
9-
9+
import RealmSwift
1010
#if canImport(WidgetKit)
1111
import WidgetKit
1212
#endif
1313

1414
final class WidgetHistorySnapshotStore {
1515
static let shared = WidgetHistorySnapshotStore()
1616

17+
private let accessQueue = DispatchQueue(label: "me.fin.bark.widget-history-snapshot", qos: .utility)
18+
1719
private let encoder: JSONEncoder = {
1820
let encoder = JSONEncoder()
1921
encoder.dateEncodingStrategy = .iso8601
@@ -31,12 +33,28 @@ final class WidgetHistorySnapshotStore {
3133
}
3234
private init() {}
3335

34-
func syncFromMessages(_ messages: [WidgetHistoryMessage], limit: Int = WidgetHistoryConstants.snapshotRetentionLimit) {
36+
func refreshFromRealmAsync(limit: Int = WidgetHistoryConstants.snapshotRetentionLimit) {
37+
accessQueue.async {
38+
guard let realm = try? Realm() else {
39+
return
40+
}
41+
let messages = realm.widgetSnapshotItems(limit: limit)
42+
self.syncFromMessagesLocked(messages, limit: limit)
43+
}
44+
}
45+
46+
func prependMessage(_ message: WidgetHistoryMessage, limit: Int = WidgetHistoryConstants.snapshotRetentionLimit) {
47+
accessQueue.sync {
48+
prependMessageLocked(message, limit: limit)
49+
}
50+
}
51+
52+
private func syncFromMessagesLocked(_ messages: [WidgetHistoryMessage], limit: Int) {
3553
let items = Array(messages.sorted { $0.createDate > $1.createDate }.prefix(limit))
3654
write(WidgetHistorySnapshot(messages: items))
3755
}
3856

39-
func prependMessage(_ message: WidgetHistoryMessage, limit: Int = WidgetHistoryConstants.snapshotRetentionLimit) {
57+
private func prependMessageLocked(_ message: WidgetHistoryMessage, limit: Int) {
4058
var items = load()?.messages ?? []
4159
items.removeAll { $0.id == message.id }
4260
items.insert(message, at: 0)

Controller/MessageListViewModel.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ class MessageListViewModel: ViewModel, ViewModelType {
323323
try? realm.write {
324324
realm.delete(message)
325325
}
326-
WidgetHistorySnapshotStore.shared.syncFromMessages(realm.widgetSnapshotItems())
326+
WidgetHistorySnapshotStore.shared.refreshFromRealmAsync()
327327
}
328328
// 删除 cell item
329329
section.messages.removeAll { cellItem in
@@ -345,7 +345,7 @@ class MessageListViewModel: ViewModel, ViewModelType {
345345
try? realm.write {
346346
realm.delete(messageResult)
347347
}
348-
WidgetHistorySnapshotStore.shared.syncFromMessages(realm.widgetSnapshotItems())
348+
WidgetHistorySnapshotStore.shared.refreshFromRealmAsync()
349349
}
350350
}
351351
// 删除 cell item
@@ -377,7 +377,7 @@ class MessageListViewModel: ViewModel, ViewModelType {
377377
try? realm.write {
378378
realm.delete(message)
379379
}
380-
WidgetHistorySnapshotStore.shared.syncFromMessages(realm.widgetSnapshotItems())
380+
WidgetHistorySnapshotStore.shared.refreshFromRealmAsync()
381381
}
382382

383383
if let index = section.messages.firstIndex(where: { item in
@@ -416,7 +416,7 @@ class MessageListViewModel: ViewModel, ViewModelType {
416416
try? realm.write {
417417
realm.delete(messages)
418418
}
419-
WidgetHistorySnapshotStore.shared.syncFromMessages(realm.widgetSnapshotItems())
419+
WidgetHistorySnapshotStore.shared.refreshFromRealmAsync()
420420
}
421421

422422
self.page = 0

0 commit comments

Comments
 (0)