Skip to content

Commit 2d81868

Browse files
feat: sync user tags (#55)
* sync user custom tags * set sync time for tags
1 parent 2188357 commit 2d81868

File tree

3 files changed

+85
-43
lines changed

3 files changed

+85
-43
lines changed

GoMoney/Constants/UserDefaultKey.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,6 @@ import Foundation
99

1010
struct UserDefaultKey {
1111
static let firstLaunch = "com.kappa.expense.firstLaunch"
12+
static let needSyncTag = "com.kappa.expense.needSyncTag"
13+
static let needSyncUserInfo = "com.kappa.expense.needSyncUserInfo"
1214
}

GoMoney/Service/SyncManager.swift

Lines changed: 77 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -8,63 +8,97 @@ class SyncManager {
88
func setSyncInterval() {
99
let interval = Double(SettingsManager.shared.getValue(for: .intervalSync) as? Int ?? SyncInterval.min1.rawValue)
1010

11-
// firebase
12-
let remote = RemoteService.shared
13-
// temp-table
14-
let tracking = TrackingService.shared
15-
16-
let timer = Timer.scheduledTimer(withTimeInterval: interval, repeats: true) { _ in
11+
let timer = Timer.scheduledTimer(withTimeInterval: interval, repeats: true) { [weak self] _ in
1712

1813
// return if no internet.
1914
if !ConnectionService.shared.isReachable {
2015
return
2116
}
2217

23-
// loop through temp-table and sync to firebase.
24-
tracking.getTransactionTracking(completion: { transactions in
25-
transactions.forEach { transaction in
26-
switch transaction.status {
27-
case TransactionTracking.Status.updated.rawValue:
28-
// if set firebase succesfully, remove from temp-table.
29-
// else not remove
30-
remote.setTransaction(by: transaction._id.stringValue, completion: { err in
31-
if let err = err {
32-
print("Sync fail: \(err)")
33-
} else {
34-
tracking.deleteTransactionTracking(by: transaction._id) { err in
35-
if let err = err {
36-
print("deleteTransactionTracking fail: \(err)")
37-
} else {
38-
SettingsManager.shared.setValue(
39-
Date().timeIntervalSince1970,
40-
for: .lastSync)
41-
}
18+
self?.syncTransactions()
19+
self?.syncTags()
20+
self?.syncUserInfo()
21+
}
22+
}
23+
24+
func syncTransactions() {
25+
// firebase
26+
let remote = RemoteService.shared
27+
// temp-table
28+
let tracking = TrackingService.shared
29+
30+
// loop through temp-table and sync to firebase.
31+
tracking.getTransactionTracking(completion: { transactions in
32+
transactions.forEach { transaction in
33+
switch transaction.status {
34+
case TransactionTracking.Status.updated.rawValue:
35+
// if set firebase succesfully, remove from temp-table.
36+
// else not remove
37+
remote.setTransaction(by: transaction._id.stringValue, completion: { err in
38+
if let err = err {
39+
print("Sync fail: \(err)")
40+
} else {
41+
tracking.deleteTransactionTracking(by: transaction._id) { err in
42+
if let err = err {
43+
print("deleteTransactionTracking fail: \(err)")
44+
} else {
45+
self.setSyncTime()
4246
}
4347
}
44-
})
45-
case TransactionTracking.Status.deleted.rawValue:
46-
// if delete from firebase sucessfully, remove from temp-table.
47-
// else not remove
48-
remote.deleteTransation(by: transaction._id.stringValue) { err in
49-
if let err = err {
50-
print("Sync fail: \(err)")
51-
} else {
52-
tracking.deleteTransactionTracking(by: transaction._id) { err in
53-
if let err = err {
54-
print("deleteTransactionTracking fail: \(err)")
55-
} else {
56-
SettingsManager.shared.setValue(
57-
Date().timeIntervalSince1970,
58-
for: .lastSync)
59-
}
48+
}
49+
})
50+
case TransactionTracking.Status.deleted.rawValue:
51+
// if delete from firebase sucessfully, remove from temp-table.
52+
// else not remove
53+
remote.deleteTransation(by: transaction._id.stringValue) { err in
54+
if let err = err {
55+
print("Sync fail: \(err)")
56+
} else {
57+
tracking.deleteTransactionTracking(by: transaction._id) { err in
58+
if let err = err {
59+
print("deleteTransactionTracking fail: \(err)")
60+
} else {
61+
self.setSyncTime()
6062
}
6163
}
6264
}
63-
default:
64-
break
6565
}
66+
default:
67+
break
68+
}
69+
}
70+
})
71+
}
72+
73+
func syncUserInfo() {
74+
if UserDefaults.standard.bool(forKey: UserDefaultKey.needSyncUserInfo) {
75+
RemoteService.shared.setTags(tags: TagService.shared.all, completion: { err in
76+
if let err = err {
77+
print("[syncUserInfo] Error \(err)")
78+
} else {
79+
UserDefaults.standard.set(false, forKey: UserDefaultKey.needSyncUserInfo)
80+
self.setSyncTime()
81+
}
82+
})
83+
}
84+
}
85+
86+
func syncTags() {
87+
if UserDefaults.standard.bool(forKey: UserDefaultKey.needSyncTag) {
88+
RemoteService.shared.setTags(tags: TagService.shared.all, completion: { err in
89+
if let err = err {
90+
print("[syncTags] Error \(err)")
91+
} else {
92+
UserDefaults.standard.set(false, forKey: UserDefaultKey.needSyncTag)
93+
self.setSyncTime()
6694
}
6795
})
6896
}
6997
}
98+
99+
private func setSyncTime() {
100+
SettingsManager.shared.setValue(
101+
Date().timeIntervalSince1970,
102+
for: .lastSync)
103+
}
70104
}

GoMoney/Service/TagService.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ class TagService {
5757
try realm.write {
5858
realm.delete(tag)
5959
}
60+
requireSync()
6061
getAllTags()
6162
completion(nil)
6263
} catch {
@@ -80,10 +81,15 @@ class TagService {
8081
try realm.write {
8182
realm.add(tag)
8283
}
84+
requireSync()
8385
getAllTags()
8486
completion(nil)
8587
} catch {
8688
completion(error.localizedDescription)
8789
}
8890
}
91+
92+
private func requireSync() {
93+
UserDefaults.standard.set(true, forKey: UserDefaultKey.needSyncTag)
94+
}
8995
}

0 commit comments

Comments
 (0)