diff --git a/GoMoney/Constants/UserDefaultKey.swift b/GoMoney/Constants/UserDefaultKey.swift index e699b6b..562b297 100644 --- a/GoMoney/Constants/UserDefaultKey.swift +++ b/GoMoney/Constants/UserDefaultKey.swift @@ -9,4 +9,6 @@ import Foundation struct UserDefaultKey { static let firstLaunch = "com.kappa.expense.firstLaunch" + static let needSyncTag = "com.kappa.expense.needSyncTag" + static let needSyncUserInfo = "com.kappa.expense.needSyncUserInfo" } diff --git a/GoMoney/Service/SyncManager.swift b/GoMoney/Service/SyncManager.swift index e66ed94..2b6d4a9 100644 --- a/GoMoney/Service/SyncManager.swift +++ b/GoMoney/Service/SyncManager.swift @@ -8,63 +8,97 @@ class SyncManager { func setSyncInterval() { let interval = Double(SettingsManager.shared.getValue(for: .intervalSync) as? Int ?? SyncInterval.min1.rawValue) - // firebase - let remote = RemoteService.shared - // temp-table - let tracking = TrackingService.shared - - let timer = Timer.scheduledTimer(withTimeInterval: interval, repeats: true) { _ in + let timer = Timer.scheduledTimer(withTimeInterval: interval, repeats: true) { [weak self] _ in // return if no internet. if !ConnectionService.shared.isReachable { return } - // loop through temp-table and sync to firebase. - tracking.getTransactionTracking(completion: { transactions in - transactions.forEach { transaction in - switch transaction.status { - case TransactionTracking.Status.updated.rawValue: - // if set firebase succesfully, remove from temp-table. - // else not remove - remote.setTransaction(by: transaction._id.stringValue, completion: { err in - if let err = err { - print("Sync fail: \(err)") - } else { - tracking.deleteTransactionTracking(by: transaction._id) { err in - if let err = err { - print("deleteTransactionTracking fail: \(err)") - } else { - SettingsManager.shared.setValue( - Date().timeIntervalSince1970, - for: .lastSync) - } + self?.syncTransactions() + self?.syncTags() + self?.syncUserInfo() + } + } + + func syncTransactions() { + // firebase + let remote = RemoteService.shared + // temp-table + let tracking = TrackingService.shared + + // loop through temp-table and sync to firebase. + tracking.getTransactionTracking(completion: { transactions in + transactions.forEach { transaction in + switch transaction.status { + case TransactionTracking.Status.updated.rawValue: + // if set firebase succesfully, remove from temp-table. + // else not remove + remote.setTransaction(by: transaction._id.stringValue, completion: { err in + if let err = err { + print("Sync fail: \(err)") + } else { + tracking.deleteTransactionTracking(by: transaction._id) { err in + if let err = err { + print("deleteTransactionTracking fail: \(err)") + } else { + self.setSyncTime() } } - }) - case TransactionTracking.Status.deleted.rawValue: - // if delete from firebase sucessfully, remove from temp-table. - // else not remove - remote.deleteTransation(by: transaction._id.stringValue) { err in - if let err = err { - print("Sync fail: \(err)") - } else { - tracking.deleteTransactionTracking(by: transaction._id) { err in - if let err = err { - print("deleteTransactionTracking fail: \(err)") - } else { - SettingsManager.shared.setValue( - Date().timeIntervalSince1970, - for: .lastSync) - } + } + }) + case TransactionTracking.Status.deleted.rawValue: + // if delete from firebase sucessfully, remove from temp-table. + // else not remove + remote.deleteTransation(by: transaction._id.stringValue) { err in + if let err = err { + print("Sync fail: \(err)") + } else { + tracking.deleteTransactionTracking(by: transaction._id) { err in + if let err = err { + print("deleteTransactionTracking fail: \(err)") + } else { + self.setSyncTime() } } } - default: - break } + default: + break + } + } + }) + } + + func syncUserInfo() { + if UserDefaults.standard.bool(forKey: UserDefaultKey.needSyncUserInfo) { + RemoteService.shared.setTags(tags: TagService.shared.all, completion: { err in + if let err = err { + print("[syncUserInfo] Error \(err)") + } else { + UserDefaults.standard.set(false, forKey: UserDefaultKey.needSyncUserInfo) + self.setSyncTime() + } + }) + } + } + + func syncTags() { + if UserDefaults.standard.bool(forKey: UserDefaultKey.needSyncTag) { + RemoteService.shared.setTags(tags: TagService.shared.all, completion: { err in + if let err = err { + print("[syncTags] Error \(err)") + } else { + UserDefaults.standard.set(false, forKey: UserDefaultKey.needSyncTag) + self.setSyncTime() } }) } } + + private func setSyncTime() { + SettingsManager.shared.setValue( + Date().timeIntervalSince1970, + for: .lastSync) + } } diff --git a/GoMoney/Service/TagService.swift b/GoMoney/Service/TagService.swift index 4d93043..5668957 100644 --- a/GoMoney/Service/TagService.swift +++ b/GoMoney/Service/TagService.swift @@ -57,6 +57,7 @@ class TagService { try realm.write { realm.delete(tag) } + requireSync() getAllTags() completion(nil) } catch { @@ -80,10 +81,15 @@ class TagService { try realm.write { realm.add(tag) } + requireSync() getAllTags() completion(nil) } catch { completion(error.localizedDescription) } } + + private func requireSync() { + UserDefaults.standard.set(true, forKey: UserDefaultKey.needSyncTag) + } }