-
Notifications
You must be signed in to change notification settings - Fork 3
Core Data Manager
김태훈 edited this page Nov 8, 2021
·
3 revisions
enum ResultType<Success, Failure: Error> {
case success(Success)
case failure(Failure)
}
Core Data Result Type 입니다. 저장하거나 불러오는 결과를 Result Type을 이용하게 됩니다.
associated type으로 ResultType이 정의되어있습니다.
func save(value: [String: Any], type name: String, completion handler: @escaping (ResultType<Void, Error>) -> Void ) {
self.entityName = name
guard let entity = entity else { return }
backgroundContext.perform { [weak self] in
guard let self = self else {
return
}
let entityObject = NSManagedObject(entity: entity, insertInto: self.container.viewContext)
value.forEach {
entityObject.setValue($0.value, forKey: $0.key)
}
let context = self.container.viewContext
do {
try context.save()
handler(.success(()))
} catch let error {
handler(.failure(error))
}
}
}
Core Data에 data를 저장하는 method입니다.
각각
- value: 실제 저장할 값 정의된 entity 형식에 맞추어 사전 형식으로 값이 들어오게 됨
- name: Booster container에 저장된 entity를 불러오기 위한 name
- handler: Result Type의 @escaping 클로저 정상적일 때는
success
오류가 있을 때는failure
입니다
func fetch<DataType: NSManagedObject>(type name: String, completion handler: @escaping (ResultType<[DataType], Error>) -> Void) {
self.entityName = name
backgroundContext.perform { [weak self] in
guard let self = self else {
return
}
do {
let context = try self.container.viewContext.fetch(DataType.fetchRequest())
guard let context = context as? [DataType] else { return }
handler(.success(context))
} catch let error {
handler(.failure(error))
}
}
}
Core Data에서 해당 entity의 데이터들을 전부 가져와서 handler로 처리하는 매서드 입니다. success
일 때 generic type이라 Core Data에 저장된 어떤 형식이든 data를 불러오는 것이 가능합니다.
공통적으로 save
, fetch
매서드는 비동기적으로 동작하게 만들었습니다.