์๋ ํ์ธ์! ๐ฑ
์ค๋์ ์ด์ ๋ง๋ ์์๋ฆฌ์คํธ์ ๋ฒํผ์ ๋๋ ์ ๋, ํด๋น ์์๋ฆฌ์คํธ๋ฅผ ์ฝ์ด๋ฐ์ดํฐ๋ก ์ ์ฅํ๋ ์์ ์ ํ์์ต๋๋ค!
ํจ๊ป ๊ฐ๋ณด์์ฃ !
CoreData ๋ฐ์ดํฐ ๊ตฌ์กฐ
์ฐ์ coreData์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ถํฐ ๋ง๋ค์ด์ฃผ์ด์ผ๊ฒ ์ฃ ?!
URLSession์์ ๊ฐ์ ธ์๋ ๋ฐ์ดํฐ ์ ๋ณด๋ค ์ค images๋ฅผ ์ ์ธํ๊ณ ๊ทธ๋๋ก ์ฌ์ฉํด์ฃผ์์ด์!
struct Product: Codable {
let id: Int
let title, description: String
let price: Int
let discountPercentage: Double
let brand, category: String
let thumbnail: String
let images: [String]
}
Editor -> Create NSManagedObject Subclass ๋ฅผ ์ด์ฉํ์ฌ CoreData์ ProductData ํด๋์ค๋ฅผ ํ์ฑํด์ฃผ์์ต๋๋ค.
CoreData์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ํจ์
์ ๋ฐ์ ์ธ CoreData๋ฅผ ๊ด๋ฆฌํด์ฃผ๊ธฐ ์ํ ProductCoreDataManager
๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ค์ด์ฃผ์ด ๊ทธ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ setProductCoreData()
ํจ์๋ฅผ ๋ง๋ค์ด์ค์๋ค!
struct ProductCoreDataManager {
// ๋ฐ์ดํฐ ๋งค๋์
static let shared = ProductCoreDataManager()
private init() {}
// ์ฑ ๋ธ๋ฆฌ๊ฒ์ดํธ
let appDelegate = UIApplication.shared.delegate as? AppDelegate
// ์์์ ์ฅ์
lazy var context = appDelegate?.persistentContainer.viewContext
// ์ํฐํฐ ์ด๋ฆ (์ฝ์ด ๋ฐ์ดํฐ์ ์ ์ฅ๋ ๊ฐ์ฒด)
let modelName: String = "ProductData"
// TodoData๋ฅผ ์์ฑํ๋ ๋ฉ์๋
mutating func setProductCoreData(data: Product) {
guard let context = context else { return }
let fetchRequest: NSFetchRequest<ProductData> = ProductData.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "id == %d", data.id)
do {
let results = try context.fetch(fetchRequest)
let newData: ProductData
if results.isEmpty {
// ์๋ก์ด ๊ฐ์ฒด ์์ฑ
guard let entity = NSEntityDescription.entity(forEntityName: modelName, in: context) else { return }
newData = NSManagedObject(entity: entity, insertInto: context) as! ProductData
} else {
// ๊ธฐ์กด ๊ฐ์ฒด ์
๋ฐ์ดํธ
newData = results.first!
}
// ์์ฑ ๊ฐ ์ค์
newData.id = Int64(data.id)
newData.title = data.title
newData.productDescription = data.description
newData.price = Int64(data.price)
newData.brand = data.brand
newData.category = data.category
newData.discountPercentage = data.discountPercentage
newData.thumbnail = data.thumbnail
// ๋ณ๊ฒฝ ์ฌํญ ์ ์ฅ
try context.save()
print(" ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์์ต๋๋ค.")
} catch {
print("Error updating ProductData: \(error)")
}
}
}
id๊ฐ ๋์ผํ ๊ฐ์ด ๋ค์ด์จ๋ค๋ฉด ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์ ๋ฐ์ดํธํ์ฌ ์ ์ฅํ๋๋ก ๊ตฌํํด์ฃผ์์ด์!
์ด์ ์ฝ์ด๋ฐ์ดํฐ์ ๊ฐ์ ๋ฃ๋ ๊ณผ์ ์ ์์ ์ฃฝ ๋จน๊ธฐ ์ ๋๋ค!
์ฝ์ด๋ฐ์ดํฐ์ ๋ฐ์ดํฐ ์ ์ฅํ๋ ํจ์์ ๋ํ ์์ธํ ์ค๋ช ์ ์๋์ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!
https://jihae-qu.tistory.com/entry/Project-todoList-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-3
๋ฒํผ ํด๋ฆญ์ ์ฝ์ด๋ฐ์ดํฐ ์ ์ฅ
์๋์ ํจ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ setProductCoreData(data: Product)
๋ฅผ ๋ถ๋ฌ์ค๋ฉด ๋ฉ๋๋ค!
@IBAction func addToWishTapped(_ sender: UIButton) {
// ์ฝ์ด๋ฐ์ดํฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ํจ์
}
์ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ProductCoreDataManager์ ์ธ์คํด์ค๊ฐ ํ์ํ๊ฒ ์ฃ ?!?
var coreDataManager = ProductCoreDataManager.shared
๋ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด์๋ ๋ฐ์ดํฐ๊ฐ ํ์ํฉ๋๋ค!!!
์ ๊ฐ ์ํ๋ ๋ฐ์ดํฐ๋ URLSession
์ ์ฌ์ฉํด ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ JSONDecoder
๋ก ๋ณํ์์ผ ์ด๋ฅผ ์ฝ๋ฐฑํจ์๋ก ์ฌ์ฉํ๊ณ ์๋๋ฐ์!
์ด ๋ฐ์ดํฐ๋ฅผ ๋ฒํผ์ด ํด๋ฆญํ์ ๋ ์ฝ์ด๋ฐ์ดํฐ๋งค๋์ ธ๋ก ์ ๋ฌํ๊ธฐ ์ํด์ ํ๋์ ๋ณ์๋ฅผ ๋ง๋ค์ด ์ค ๋ค
var currentProduct: Product?
setData
๋ผ๋ ํจ์๊ฐ ์ถ๋ ฅ์ด ๋์์ ๋, ํด๋น ๋ณ์์ ๋ฐ์ดํฐ ๊ฐ์ ์ ์ฅํด์ค๋๋ค.
func setDataAndLabel() {
dataManager.getProductData(id: randomid ) { product in
DispatchQueue.main.async {
if let product = product {
dump(product)
self.setData(product)
}
}
}
}
func setData(_ product: Product) {
currentProduct = product
print("ํ์ฌ์ ์ ํ ์ ๋ณด : \(currentProduct)")
// if let url = URL(string: product.thumbnail) {
// URLSession.shared.dataTask(with: url) { data, response, error in
// if let data = data, error == nil {
// DispatchQueue.main.async {
// self.productImageView.image = UIImage(data: data)
// }
// }
// }.resume()
// }
// productBrandLabel.text = product.brand
// productTitleLabel.text = product.title
// productPriceLabel.text = "\(product.price) ์"
// productDescriptionLabel.text = product.description
}
์ ์ถ๋ ฅ์ด ๋๊ณ ์๋์ง ํ์ธํ๊ธฐ ์ํด print()๋ฅผ ํ์ฌ ํ์ฌ ์ ํ ์ ๋ณด๋ฅผ ์ถ๋ ฅํด๋ณด์์ด์!
์์ฃผ ์ ์ถ๋ ฅ์ด ๋ฉ๋๋ค!
๊ทธ๋ผ ์ด์ ๋ฒํผ ํด๋ฆญ์ ์ฝ์ด๋ฐ์ดํฐ๋งค๋์ ์๊ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ฉฐ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด๋ฐ์ดํฐ ์ ์ฅ์์ ์ ์ฅํ๋ฉด ๋ฉ๋๋ค!
@IBAction func addToWishTapped(_ sender: UIButton) {
guard let product = currentProduct else { return }
coreDataManager.setProductCoreData(data: product)
}