Skip to content

Commit adb015c

Browse files
committed
将「增量同步」改为可配置选项,以解决一些已知的问题
1 parent c670c7a commit adb015c

File tree

5 files changed

+33
-2
lines changed

5 files changed

+33
-2
lines changed

Image Downloader/HistoryManager.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,13 +186,17 @@ class HistoryManager: ObservableObject {
186186
// Conflict resolution: Remote wins if newer (or backend logic implies remote is truth)
187187
let local = items[index]
188188
if remote.updatedAt >= local.updatedAt {
189+
logDebug("History Merge [Update]: \(remote.id) - Local isDeleted: \(local.isDeleted) -> Remote isDeleted: \(remote.isDeleted) (Remote updatedAt: \(remote.updatedAt) >= Local: \(local.updatedAt))")
189190
var merged = remote
190191
merged.isDirty = false
191192
items[index] = merged
192193
needsSave = true
194+
} else {
195+
logDebug("History Merge [Skip]: \(remote.id) - Remote updatedAt: \(remote.updatedAt) < Local: \(local.updatedAt)")
193196
}
194197
} else {
195198
// Insert new record
199+
logDebug("History Merge [New]: \(remote.id) - isDeleted: \(remote.isDeleted)")
196200
var newRecord = remote
197201
newRecord.isDirty = false
198202
items.append(newRecord)

Image Downloader/HistorySyncManager.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ struct HistoryItemAPI: Codable {
5151
let timestampDate = formatter.date(from: created_at) ?? Date()
5252
let updatedAtDate = formatter.date(from: updated_at) ?? Date()
5353

54+
if is_deleted {
55+
logDebug("Parsing Remote History Item: \(id) - URL: \(url.prefix(20))... - is_deleted: \(is_deleted), updated_at: \(updated_at)")
56+
}
57+
5458
return HistoryItem(
5559
id: id,
5660
url: url,
@@ -105,9 +109,12 @@ class HistorySyncManager: ObservableObject {
105109

106110
var queryItems = [URLQueryItem(name: "token", value: backendToken)]
107111

108-
if let lastSynced = HistoryManager.shared.lastSyncedAt {
112+
let incrementalSync = UserDefaults.standard.bool(forKey: "incrementalSync")
113+
if incrementalSync, let lastSynced = HistoryManager.shared.lastSyncedAt {
109114
let encodedDate = ISO8601DateFormatter.string(from: lastSynced, timeZone: TimeZone(secondsFromGMT: 0)!, formatOptions: [.withInternetDateTime, .withFractionalSeconds])
110115
queryItems.append(URLQueryItem(name: "since", value: encodedDate))
116+
} else if !incrementalSync {
117+
logDebug("Performing full history sync (Incremental sync disabled)")
111118
}
112119

113120
components.queryItems = queryItems
@@ -147,6 +154,8 @@ class HistorySyncManager: ObservableObject {
147154
// 4. Handle Response
148155
let syncResponse = try JSONDecoder().decode(SyncResponse.self, from: data)
149156

157+
logDebug("Pulled \(syncResponse.records.count) history records from remote. SyncedAt: \(syncResponse.syncedAt)")
158+
150159
// Process Remote Records
151160
let remoteRecords = syncResponse.records.map { $0.toLocalItem() }
152161

Image Downloader/SavedLinksManager.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,12 +235,16 @@ class SavedLinksManager: ObservableObject {
235235
if let index = items.firstIndex(where: { $0.id == remote.id }) {
236236
let local = items[index]
237237
if remote.updatedAt >= local.updatedAt {
238+
logDebug("Merge [Update]: \(remote.id) - Local isDeleted: \(local.isDeleted) -> Remote isDeleted: \(remote.isDeleted) (Remote updatedAt: \(remote.updatedAt) >= Local: \(local.updatedAt))")
238239
var merged = remote
239240
merged.isDirty = false
240241
items[index] = merged
241242
needsSave = true
243+
} else {
244+
logDebug("Merge [Skip]: \(remote.id) - Remote updatedAt: \(remote.updatedAt) < Local: \(local.updatedAt)")
242245
}
243246
} else {
247+
logDebug("Merge [New]: \(remote.id) - isDeleted: \(remote.isDeleted)")
244248
var newRecord = remote
245249
newRecord.isDirty = false
246250
items.append(newRecord)

Image Downloader/SavedLinksSyncManager.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ struct SavedLinkItemAPI: Codable {
4848
let updatedAtDate = formatter.date(from: updated_at) ?? Date()
4949
let parsedStatus = SavedLinkStatus(rawValue: status) ?? .none
5050

51+
if is_deleted {
52+
logDebug("Parsing Remote Item: \(id) - URL: \(url.prefix(20))... - is_deleted: \(is_deleted), updated_at: \(updated_at)")
53+
}
54+
5155
return SavedLinkItem(
5256
id: id,
5357
url: url,
@@ -98,9 +102,12 @@ class SavedLinksSyncManager: ObservableObject {
98102

99103
var queryItems = [URLQueryItem(name: "token", value: backendToken)]
100104

101-
if let lastSynced = SavedLinksManager.shared.lastSyncedAt {
105+
let incrementalSync = UserDefaults.standard.bool(forKey: "incrementalSync")
106+
if incrementalSync, let lastSynced = SavedLinksManager.shared.lastSyncedAt {
102107
let encodedDate = ISO8601DateFormatter.string(from: lastSynced, timeZone: TimeZone(secondsFromGMT: 0)!, formatOptions: [.withInternetDateTime, .withFractionalSeconds])
103108
queryItems.append(URLQueryItem(name: "since", value: encodedDate))
109+
} else if !incrementalSync {
110+
logDebug("Performing full SavedLinks sync (Incremental sync disabled)")
104111
}
105112

106113
components.queryItems = queryItems
@@ -138,6 +145,8 @@ class SavedLinksSyncManager: ObservableObject {
138145

139146
let syncResponse = try JSONDecoder().decode(SavedLinksSyncResponse.self, from: data)
140147

148+
logDebug("Pulled \(syncResponse.records.count) records from remote. SyncedAt: \(syncResponse.syncedAt)")
149+
141150
let remoteRecords = syncResponse.records.map { $0.toLocalItem() }
142151

143152
await MainActor.run {

Image Downloader/SettingsView.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ struct SettingsView: View {
1212
@AppStorage("backendUrl") private var backendUrl: String = ""
1313
@AppStorage("backendToken") private var backendToken: String = ""
1414
@AppStorage("saveLinksOnly") private var saveLinksOnly: Bool = false
15+
@AppStorage("incrementalSync") private var incrementalSync: Bool = true
1516
@AppStorage("logDisplayLevel") private var logDisplayLevel: Int = 1
1617

1718
var body: some View {
@@ -27,6 +28,10 @@ struct SettingsView: View {
2728
Section(header: Text("收藏模式").textCase(nil), footer: Text("开启后,首页的「下载」按钮将被替换为「收藏」,仅提取并保存有效链接而不下载资源。")) {
2829
Toggle("仅保存链接", isOn: $saveLinksOnly)
2930
}
31+
32+
Section(header: Text("同步").textCase(nil), footer: Text("开启增量同步将仅获取自上次同步以来的更新。为节约您的流量,建议保持开启状态。")) {
33+
Toggle("增量同步", isOn: $incrementalSync)
34+
}
3035

3136
Section(header: Text("日志").textCase(nil), footer: Text("如果遇到问题,可以查看日志以获取更多信息。")) {
3237
Picker(selection: $logDisplayLevel) {

0 commit comments

Comments
 (0)