Skip to content

CoreData

WooSeok Suh edited this page Jul 28, 2021 · 1 revision

2021-07-28

by Seok

Step.1

MemoryStorage -> PersistenceStorage로 변경

  • 기존 memoryStorage코드에 coredata 저장코드 추가 구현
  • Service 안정성을 위하여 Firebase외에 coredata 활용
  • 네트워크 연결 안될 시에도 coredata에 저장되며, background진입/앱 종료 시에 firebase에 저장
  • 추후 Error 처리 구현 필요
// MARK: CoreData Method
private extension PersistenceStorage {
        
    private func fetchUnit() -> [ItemInformation] {
        do {
            guard let fetchResult = try context.fetch(ItemInformation.fetchRequest()) as? [ItemInformation] else { return [] }
            return fetchResult
        } catch {
            print(error)
            return []
        }
    }

    private func updateUnit(to unit: Unit) {
        for info in fetchUnit() where info.uuid == unit.uuid {
            info.setValue(unit.uuid, forKey: "uuid")
            info.setValue(unit.image, forKey: "image")
            info.setValue(unit.level, forKey: "level")
        }
        do {
            try context.save()
        } catch {
            print(error)
        }
    }
    
    private func updateMoney(money: Int) {
        do {
            guard let previousInfo = fetchMoneyInfo().first else { return }
            previousInfo.setValue(money, forKey: "myMoney")
            try context.save()
        } catch {
            print(error)
        }
    }
    
    private func updateScore(score: Int) {
        do {
            guard let previousInfo = fetchScoreInfo().first else { return }
            previousInfo.setValue(score, forKey: "myScore")
            try context.save()
        } catch {
            print(error)
        }
    }
    
    private func fetchMoneyInfo() -> [MoneyInformation] {
        do {
            guard let fetchResult = try context.fetch(MoneyInformation.fetchRequest()) as? [MoneyInformation] else {
                return []
            }
            return fetchResult
        } catch {
            print(error)
            return []
        }
    }
    
    private func fetchScoreInfo() -> [ScoreInformation] {
        do {
            guard let fetchResult = try context.fetch(ScoreInformation.fetchRequest()) as? [ScoreInformation] else {
                return []
            }
            return fetchResult
        } catch {
            print(error)
            return []
        }
    }
    
    private func appendUnitInfo(_ unit: Unit) {
        if let entity = NSEntityDescription.entity(forEntityName: "ItemInformation", in: context) {
            let info = NSManagedObject(entity: entity, insertInto: context)
            info.setValue(unit.uuid, forKey: "uuid")
            info.setValue(unit.image, forKey: "image")
            info.setValue(unit.level, forKey: "level")
            
            do {
                try context.save()
            } catch {
                print(error.localizedDescription)
            }
        }
    }
    
    private func appendMoenyInfo(_ money: Int) {
        if let entity = NSEntityDescription.entity(forEntityName: "MoneyInformation", in: context) {
            let info = NSManagedObject(entity: entity, insertInto: context)
            info.setValue(money, forKey: "myMoney")
            
            do {
                try context.save()
            } catch {
                print(error)
            }
        }
        moneyStore = money
        moneyStatus.onNext(moneyStore)
    }
    
    private func appendScoreInfo(_ score: Int) {
        if let entity = NSEntityDescription.entity(forEntityName: "ScoreInformation", in: context) {
            let info = NSManagedObject(entity: entity, insertInto: context)
            info.setValue(score, forKey: "myScore")
            
            do {
                try context.save()
            } catch {
                print(error)
            }
        }
    }
}
Clone this wiki locally