Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions GoMoney/Constants/UserDefaultKey.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
120 changes: 77 additions & 43 deletions GoMoney/Service/SyncManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
6 changes: 6 additions & 0 deletions GoMoney/Service/TagService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ class TagService {
try realm.write {
realm.delete(tag)
}
requireSync()
getAllTags()
completion(nil)
} catch {
Expand All @@ -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)
}
}