From ca5c3652dcc561e9a2134bcf73e0a039fd3c65b2 Mon Sep 17 00:00:00 2001 From: Sonjh1306 Date: Wed, 21 Apr 2021 16:05:27 +0900 Subject: [PATCH 1/2] feat: Create Netword Model --- .../SideDish.xcodeproj/project.pbxproj | 70 ++++++++++++++++-- .../UserInterfaceState.xcuserstate | Bin 38666 -> 61170 bytes .../SideDish/{ => AppCycle}/AppDelegate.swift | 0 .../{ => AppCycle}/SceneDelegate.swift | 0 .../SideDish/SideDish/Model/DTO/Network.swift | 26 +++++++ .../SideDish/SideDish/Model/DTO/Parsing.swift | 31 ++++++++ .../SideDish/SideDish/Model/DTO/Request.swift | 23 ++++++ frontend/SideDish/SideDish/Model/Menu.swift | 39 ++++++++++ frontend/SideDish/SideDish/Model/Menus.swift | 22 ++++++ .../SideDish/{ => View}/MenuCell.swift | 2 + .../SideDish/SideDish/{ => View}/MenuCell.xib | 0 .../SideDish/SideDish/ViewController.swift | 15 ++++ 12 files changed, 223 insertions(+), 5 deletions(-) rename frontend/SideDish/SideDish/{ => AppCycle}/AppDelegate.swift (100%) rename frontend/SideDish/SideDish/{ => AppCycle}/SceneDelegate.swift (100%) create mode 100644 frontend/SideDish/SideDish/Model/DTO/Network.swift create mode 100644 frontend/SideDish/SideDish/Model/DTO/Parsing.swift create mode 100644 frontend/SideDish/SideDish/Model/DTO/Request.swift create mode 100644 frontend/SideDish/SideDish/Model/Menu.swift create mode 100644 frontend/SideDish/SideDish/Model/Menus.swift rename frontend/SideDish/SideDish/{ => View}/MenuCell.swift (84%) rename frontend/SideDish/SideDish/{ => View}/MenuCell.xib (100%) diff --git a/frontend/SideDish/SideDish.xcodeproj/project.pbxproj b/frontend/SideDish/SideDish.xcodeproj/project.pbxproj index 82de7546f..a55d670e1 100644 --- a/frontend/SideDish/SideDish.xcodeproj/project.pbxproj +++ b/frontend/SideDish/SideDish.xcodeproj/project.pbxproj @@ -9,6 +9,8 @@ /* Begin PBXBuildFile section */ BD090658262E9B450094421D /* MenuCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD090656262E9B450094421D /* MenuCell.swift */; }; BD090659262E9B450094421D /* MenuCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BD090657262E9B450094421D /* MenuCell.xib */; }; + BD09065E262EBD310094421D /* Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD09065D262EBD310094421D /* Menu.swift */; }; + BD09066D262EC5120094421D /* Menus.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD09066C262EC5120094421D /* Menus.swift */; }; BD930B58262D6F5800906633 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD930B57262D6F5800906633 /* AppDelegate.swift */; }; BD930B5A262D6F5800906633 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD930B59262D6F5800906633 /* SceneDelegate.swift */; }; BD930B5C262D6F5800906633 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD930B5B262D6F5800906633 /* ViewController.swift */; }; @@ -17,6 +19,9 @@ BD930B64262D6F5900906633 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BD930B62262D6F5900906633 /* LaunchScreen.storyboard */; }; BD930B6F262D6F5900906633 /* SideDishTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD930B6E262D6F5900906633 /* SideDishTests.swift */; }; BD930B7A262D6F5900906633 /* SideDishUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD930B79262D6F5900906633 /* SideDishUITests.swift */; }; + BDFABA96262FF9FC00803154 /* Parsing.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDFABA95262FF9FC00803154 /* Parsing.swift */; }; + BDFABA9B262FFA0600803154 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDFABA9A262FFA0600803154 /* Request.swift */; }; + BDFABAA0262FFA1C00803154 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDFABA9F262FFA1C00803154 /* Network.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -39,6 +44,8 @@ /* Begin PBXFileReference section */ BD090656262E9B450094421D /* MenuCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuCell.swift; sourceTree = ""; }; BD090657262E9B450094421D /* MenuCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MenuCell.xib; sourceTree = ""; }; + BD09065D262EBD310094421D /* Menu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Menu.swift; sourceTree = ""; }; + BD09066C262EC5120094421D /* Menus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Menus.swift; sourceTree = ""; }; BD930B54262D6F5800906633 /* SideDish.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SideDish.app; sourceTree = BUILT_PRODUCTS_DIR; }; BD930B57262D6F5800906633 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; BD930B59262D6F5800906633 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; @@ -53,6 +60,9 @@ BD930B75262D6F5900906633 /* SideDishUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SideDishUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; BD930B79262D6F5900906633 /* SideDishUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SideDishUITests.swift; sourceTree = ""; }; BD930B7B262D6F5900906633 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + BDFABA95262FF9FC00803154 /* Parsing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Parsing.swift; sourceTree = ""; }; + BDFABA9A262FFA0600803154 /* Request.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Request.swift; sourceTree = ""; }; + BDFABA9F262FFA1C00803154 /* Network.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -80,6 +90,51 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + BD090662262EBD350094421D /* Model */ = { + isa = PBXGroup; + children = ( + BD090674262ED1CA0094421D /* DTO */, + BD09065D262EBD310094421D /* Menu.swift */, + BD09066C262EC5120094421D /* Menus.swift */, + ); + path = Model; + sourceTree = ""; + }; + BD090666262EBD7A0094421D /* Controller */ = { + isa = PBXGroup; + children = ( + ); + path = Controller; + sourceTree = ""; + }; + BD090667262EBD820094421D /* View */ = { + isa = PBXGroup; + children = ( + BD090656262E9B450094421D /* MenuCell.swift */, + BD090657262E9B450094421D /* MenuCell.xib */, + ); + path = View; + sourceTree = ""; + }; + BD090668262EBDC80094421D /* AppCycle */ = { + isa = PBXGroup; + children = ( + BD930B57262D6F5800906633 /* AppDelegate.swift */, + BD930B59262D6F5800906633 /* SceneDelegate.swift */, + ); + path = AppCycle; + sourceTree = ""; + }; + BD090674262ED1CA0094421D /* DTO */ = { + isa = PBXGroup; + children = ( + BDFABA95262FF9FC00803154 /* Parsing.swift */, + BDFABA9A262FFA0600803154 /* Request.swift */, + BDFABA9F262FFA1C00803154 /* Network.swift */, + ); + path = DTO; + sourceTree = ""; + }; BD930B4B262D6F5800906633 = { isa = PBXGroup; children = ( @@ -103,14 +158,14 @@ BD930B56262D6F5800906633 /* SideDish */ = { isa = PBXGroup; children = ( - BD930B57262D6F5800906633 /* AppDelegate.swift */, - BD930B59262D6F5800906633 /* SceneDelegate.swift */, + BD090668262EBDC80094421D /* AppCycle */, + BD090667262EBD820094421D /* View */, + BD090666262EBD7A0094421D /* Controller */, + BD090662262EBD350094421D /* Model */, BD930B5B262D6F5800906633 /* ViewController.swift */, BD930B5D262D6F5800906633 /* Main.storyboard */, - BD090656262E9B450094421D /* MenuCell.swift */, - BD090657262E9B450094421D /* MenuCell.xib */, - BD930B60262D6F5900906633 /* Assets.xcassets */, BD930B62262D6F5900906633 /* LaunchScreen.storyboard */, + BD930B60262D6F5900906633 /* Assets.xcassets */, BD930B65262D6F5900906633 /* Info.plist */, ); path = SideDish; @@ -265,10 +320,15 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + BDFABA96262FF9FC00803154 /* Parsing.swift in Sources */, + BDFABA9B262FFA0600803154 /* Request.swift in Sources */, BD930B5C262D6F5800906633 /* ViewController.swift in Sources */, BD930B58262D6F5800906633 /* AppDelegate.swift in Sources */, BD090658262E9B450094421D /* MenuCell.swift in Sources */, + BDFABAA0262FFA1C00803154 /* Network.swift in Sources */, BD930B5A262D6F5800906633 /* SceneDelegate.swift in Sources */, + BD09066D262EC5120094421D /* Menus.swift in Sources */, + BD09065E262EBD310094421D /* Menu.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/frontend/SideDish/SideDish.xcodeproj/project.xcworkspace/xcuserdata/sonjuhyeong.xcuserdatad/UserInterfaceState.xcuserstate b/frontend/SideDish/SideDish.xcodeproj/project.xcworkspace/xcuserdata/sonjuhyeong.xcuserdatad/UserInterfaceState.xcuserstate index 313534b79f753fca1635b73270a3724b0b4f7d58..01735c39c2c00ce0b95f6367ac3dafacaa08c90f 100644 GIT binary patch literal 61170 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 delta 18465 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 Hvj6`9#^PBA diff --git a/frontend/SideDish/SideDish/AppDelegate.swift b/frontend/SideDish/SideDish/AppCycle/AppDelegate.swift similarity index 100% rename from frontend/SideDish/SideDish/AppDelegate.swift rename to frontend/SideDish/SideDish/AppCycle/AppDelegate.swift diff --git a/frontend/SideDish/SideDish/SceneDelegate.swift b/frontend/SideDish/SideDish/AppCycle/SceneDelegate.swift similarity index 100% rename from frontend/SideDish/SideDish/SceneDelegate.swift rename to frontend/SideDish/SideDish/AppCycle/SceneDelegate.swift diff --git a/frontend/SideDish/SideDish/Model/DTO/Network.swift b/frontend/SideDish/SideDish/Model/DTO/Network.swift new file mode 100644 index 000000000..752c03a96 --- /dev/null +++ b/frontend/SideDish/SideDish/Model/DTO/Network.swift @@ -0,0 +1,26 @@ +// +// Network.swift +// SideDish +// +// Created by sonjuhyeong on 2021/04/21. +// + +import Foundation + +class DataTaskManager { + + static let session = URLSession(configuration: .default) + + static func get(completion: @escaping (Result) -> Void) { + session.dataTask(with: RequestManager.getRequest()) { data, response, error in + if let data = data { + guard let menuList = ParsingManager.decodeData(type: getMenu.self, data: data) else { print("d"); return } + completion(.success(menuList)) + } else { + guard let error = error?.localizedDescription as? Error else { return } + completion(.failure(error)) + } + }.resume() + } + +} diff --git a/frontend/SideDish/SideDish/Model/DTO/Parsing.swift b/frontend/SideDish/SideDish/Model/DTO/Parsing.swift new file mode 100644 index 000000000..df70240bd --- /dev/null +++ b/frontend/SideDish/SideDish/Model/DTO/Parsing.swift @@ -0,0 +1,31 @@ +// +// Parsing.swift +// SideDish +// +// Created by sonjuhyeong on 2021/04/21. +// + +import Foundation + +class ParsingManager { + + static func encodeData(data: T) -> Data? { + let encoder = JSONEncoder() + do { + return try encoder.encode(data) + }catch{ + print("Encode error") + return nil + } + } + + static func decodeData(type: T.Type, data: Data) -> T? { + let decoder = JSONDecoder() + do { + return try decoder.decode(type, from: data) + }catch{ + print("Decode error") + return nil + } + } +} diff --git a/frontend/SideDish/SideDish/Model/DTO/Request.swift b/frontend/SideDish/SideDish/Model/DTO/Request.swift new file mode 100644 index 000000000..b538dab9b --- /dev/null +++ b/frontend/SideDish/SideDish/Model/DTO/Request.swift @@ -0,0 +1,23 @@ +// +// Request.swift +// SideDish +// +// Created by sonjuhyeong on 2021/04/21. +// + +import Foundation + +class RequestManager { + + static let urlString = "https://h3rb9c0ugl.execute-api.ap-northeast-2.amazonaws.com/develop/baminchan/best/17011200" + //GET + static func getRequest() -> URLRequest { + guard let url = URL(string: urlString) else { + print("The URL is inappropriate.") + return URLRequest(url: URL(string: "")!) + } + return URLRequest(url: url) + } + + +} diff --git a/frontend/SideDish/SideDish/Model/Menu.swift b/frontend/SideDish/SideDish/Model/Menu.swift new file mode 100644 index 000000000..75aa33849 --- /dev/null +++ b/frontend/SideDish/SideDish/Model/Menu.swift @@ -0,0 +1,39 @@ +// +// Menu.swift +// SideDish +// +// Created by sonjuhyeong on 2021/04/20. +// + +import Foundation + +class Menu: Codable { + + private let detail_hash: String + private let image: String + private let alt: String + private let delivery_type: [String] + private let title: String + private let description: String + private let n_price: String? + private let s_price: String + private let badge: [String]? + + init(detail_hash: String, image: String, alt: String, delivery_type: [String], title: String, description: String, n_price: String?, s_price: String, badge: [String]?) { + self.detail_hash = detail_hash + self.image = image + self.alt = alt + self.delivery_type = delivery_type + self.title = title + self.description = description + self.n_price = n_price + self.s_price = s_price + self.badge = badge + } +} + +struct getMenu: Codable { + let category_id: String + let name: String + let items: [Menu] +} diff --git a/frontend/SideDish/SideDish/Model/Menus.swift b/frontend/SideDish/SideDish/Model/Menus.swift new file mode 100644 index 000000000..8ea01ec84 --- /dev/null +++ b/frontend/SideDish/SideDish/Model/Menus.swift @@ -0,0 +1,22 @@ +// +// VariousMenu.swift +// SideDish +// +// Created by sonjuhyeong on 2021/04/20. +// + +import Foundation + +class Menus { + + private var menus: [Menu] + + init(menus: [Menu]) { + self.menus = menus + } + + func addMenu(menu: Menu) { + menus.append(menu) + } +} + diff --git a/frontend/SideDish/SideDish/MenuCell.swift b/frontend/SideDish/SideDish/View/MenuCell.swift similarity index 84% rename from frontend/SideDish/SideDish/MenuCell.swift rename to frontend/SideDish/SideDish/View/MenuCell.swift index 4c84a5862..31cec0585 100644 --- a/frontend/SideDish/SideDish/MenuCell.swift +++ b/frontend/SideDish/SideDish/View/MenuCell.swift @@ -25,8 +25,10 @@ class MenuCell: UICollectionViewCell { func configure() { self.eventLabel.layer.masksToBounds = true self.eventLabel.layer.cornerRadius = 5 + self.eventLabel.layer.isHidden = true self.launchingLabel.layer.masksToBounds = true self.launchingLabel.layer.cornerRadius = 5 + self.launchingLabel.leftAnchor.constraint(equalTo: self.thumbnailImage.rightAnchor, constant: 8).isActive = true self.titleLabel.text = "[미노리키친] 일본식 우엉조림 (킨피라고보) 80g" } diff --git a/frontend/SideDish/SideDish/MenuCell.xib b/frontend/SideDish/SideDish/View/MenuCell.xib similarity index 100% rename from frontend/SideDish/SideDish/MenuCell.xib rename to frontend/SideDish/SideDish/View/MenuCell.xib diff --git a/frontend/SideDish/SideDish/ViewController.swift b/frontend/SideDish/SideDish/ViewController.swift index d33a9b09a..ec2429425 100644 --- a/frontend/SideDish/SideDish/ViewController.swift +++ b/frontend/SideDish/SideDish/ViewController.swift @@ -17,7 +17,22 @@ class ViewController: UIViewController { sideDishCollectionView.register(nibName, forCellWithReuseIdentifier: "menuCell") sideDishCollectionView.dataSource = self sideDishCollectionView.delegate = self + loadCard() } + + private func loadCard() { + DataTaskManager.get(completion: { (result) in + DispatchQueue.global().async { + switch result { + case .success(let data): + print(data) + case.failure(let error): + print(error.localizedDescription) + } + } + }) + } + } From debc96f3675735a7e9c3838cd3edb6f4589e7e6c Mon Sep 17 00:00:00 2001 From: BMO Date: Wed, 21 Apr 2021 17:44:40 +0900 Subject: [PATCH 2/2] feat: Create DataSource and Check MainView (#5) --- .../SideDish/Model/DTO/JSONModel.swift | 7 ++++ .../SideDish/SideDish/Model/DTO/Request.swift | 2 +- frontend/SideDish/SideDish/Model/Menu.swift | 31 +++++++++++++-- frontend/SideDish/SideDish/Model/Menus.swift | 14 ++++--- .../View/MainDiffableDataSource.swift | 26 +++++++++++++ .../SideDish/SideDish/View/MenuCell.swift | 3 -- frontend/SideDish/SideDish/View/MenuCell.xib | 2 +- .../SideDish/SideDish/ViewController.swift | 38 ++++++++----------- 8 files changed, 87 insertions(+), 36 deletions(-) create mode 100644 frontend/SideDish/SideDish/Model/DTO/JSONModel.swift create mode 100644 frontend/SideDish/SideDish/View/MainDiffableDataSource.swift diff --git a/frontend/SideDish/SideDish/Model/DTO/JSONModel.swift b/frontend/SideDish/SideDish/Model/DTO/JSONModel.swift new file mode 100644 index 000000000..66a9641af --- /dev/null +++ b/frontend/SideDish/SideDish/Model/DTO/JSONModel.swift @@ -0,0 +1,7 @@ + +import Foundation + +struct getMenu: Codable { + let statusCode: Int + let body: [Menu] +} diff --git a/frontend/SideDish/SideDish/Model/DTO/Request.swift b/frontend/SideDish/SideDish/Model/DTO/Request.swift index b538dab9b..3cd8da5d4 100644 --- a/frontend/SideDish/SideDish/Model/DTO/Request.swift +++ b/frontend/SideDish/SideDish/Model/DTO/Request.swift @@ -9,7 +9,7 @@ import Foundation class RequestManager { - static let urlString = "https://h3rb9c0ugl.execute-api.ap-northeast-2.amazonaws.com/develop/baminchan/best/17011200" + static let urlString = "https://h3rb9c0ugl.execute-api.ap-northeast-2.amazonaws.com/develop/baminchan/main" //GET static func getRequest() -> URLRequest { guard let url = URL(string: urlString) else { diff --git a/frontend/SideDish/SideDish/Model/Menu.swift b/frontend/SideDish/SideDish/Model/Menu.swift index 75aa33849..9a51344de 100644 --- a/frontend/SideDish/SideDish/Model/Menu.swift +++ b/frontend/SideDish/SideDish/Model/Menu.swift @@ -30,10 +30,33 @@ class Menu: Codable { self.s_price = s_price self.badge = badge } + + func configure(cell: MenuCell) { + cell.titleLabel.text = self.title + cell.bodyLabel.text = self.description + cell.currentPriceLabel.text = self.s_price + } } -struct getMenu: Codable { - let category_id: String - let name: String - let items: [Menu] + + +extension Menu: Hashable, Equatable { + static func == (lhs: Menu, rhs: Menu) -> Bool { + return lhs.detail_hash == rhs.detail_hash || lhs.image == rhs.image || + lhs.alt == rhs.alt || lhs.delivery_type == rhs.delivery_type || + lhs.title == rhs.title || lhs.description == rhs.description || + lhs.n_price == rhs.n_price || lhs.s_price == rhs.s_price || lhs.badge == rhs.badge + } + + func hash(into hasher: inout Hasher) { + hasher.combine(detail_hash) + hasher.combine(image) + hasher.combine(alt) + hasher.combine(delivery_type) + hasher.combine(title) + hasher.combine(description) + hasher.combine(n_price) + hasher.combine(s_price) + hasher.combine(badge) + } } diff --git a/frontend/SideDish/SideDish/Model/Menus.swift b/frontend/SideDish/SideDish/Model/Menus.swift index 8ea01ec84..33b9c8a4a 100644 --- a/frontend/SideDish/SideDish/Model/Menus.swift +++ b/frontend/SideDish/SideDish/Model/Menus.swift @@ -9,14 +9,18 @@ import Foundation class Menus { - private var menus: [Menu] + private var menus: [Menu]! - init(menus: [Menu]) { - self.menus = menus + init() { + self.menus = nil } - func addMenu(menu: Menu) { - menus.append(menu) + func add(menuList: [Menu]) { + self.menus = menuList + } + + func giveMenu() -> [Menu] { + return self.menus } } diff --git a/frontend/SideDish/SideDish/View/MainDiffableDataSource.swift b/frontend/SideDish/SideDish/View/MainDiffableDataSource.swift new file mode 100644 index 000000000..5142d3a57 --- /dev/null +++ b/frontend/SideDish/SideDish/View/MainDiffableDataSource.swift @@ -0,0 +1,26 @@ + +import Foundation +import UIKit + +class MainDiffableDataSource { + + private var dataSource : UICollectionViewDiffableDataSource! + + func setupDataSource(collectionView: UICollectionView) { + self.dataSource = UICollectionViewDiffableDataSource(collectionView: collectionView) { + (collectionView, indexPath, menu) -> UICollectionViewCell? in + guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "menuCell", for: indexPath) as? MenuCell else { preconditionFailure() } + + menu.configure(cell: cell) + return cell + } + } + + func applySnapshot(data: [Menu]) { + let menus = data + var snapshot = NSDiffableDataSourceSnapshot() + snapshot.appendSections([1]) + snapshot.appendItems(menus) + self.dataSource.apply(snapshot, animatingDifferences: true) + } +} diff --git a/frontend/SideDish/SideDish/View/MenuCell.swift b/frontend/SideDish/SideDish/View/MenuCell.swift index 31cec0585..29b57c492 100644 --- a/frontend/SideDish/SideDish/View/MenuCell.swift +++ b/frontend/SideDish/SideDish/View/MenuCell.swift @@ -25,11 +25,8 @@ class MenuCell: UICollectionViewCell { func configure() { self.eventLabel.layer.masksToBounds = true self.eventLabel.layer.cornerRadius = 5 - self.eventLabel.layer.isHidden = true self.launchingLabel.layer.masksToBounds = true self.launchingLabel.layer.cornerRadius = 5 - self.launchingLabel.leftAnchor.constraint(equalTo: self.thumbnailImage.rightAnchor, constant: 8).isActive = true - self.titleLabel.text = "[미노리키친] 일본식 우엉조림 (킨피라고보) 80g" } } diff --git a/frontend/SideDish/SideDish/View/MenuCell.xib b/frontend/SideDish/SideDish/View/MenuCell.xib index 70965c973..621169e22 100644 --- a/frontend/SideDish/SideDish/View/MenuCell.xib +++ b/frontend/SideDish/SideDish/View/MenuCell.xib @@ -51,7 +51,7 @@ - + diff --git a/frontend/SideDish/SideDish/ViewController.swift b/frontend/SideDish/SideDish/ViewController.swift index ec2429425..f9e1a1567 100644 --- a/frontend/SideDish/SideDish/ViewController.swift +++ b/frontend/SideDish/SideDish/ViewController.swift @@ -11,13 +11,21 @@ class ViewController: UIViewController { @IBOutlet weak var sideDishCollectionView: UICollectionView! + private var dataSource = MainDiffableDataSource() + private var menus = Menus() + + override func viewDidLoad() { super.viewDidLoad() + + configureCollectionView() + loadCard() + } + + private func configureCollectionView() { let nibName = UINib(nibName: "MenuCell", bundle: .none) sideDishCollectionView.register(nibName, forCellWithReuseIdentifier: "menuCell") - sideDishCollectionView.dataSource = self - sideDishCollectionView.delegate = self - loadCard() + self.dataSource.setupDataSource(collectionView: self.sideDishCollectionView) } private func loadCard() { @@ -25,7 +33,8 @@ class ViewController: UIViewController { DispatchQueue.global().async { switch result { case .success(let data): - print(data) + self.menus.add(menuList: data.body) + self.putData() case.failure(let error): print(error.localizedDescription) } @@ -33,23 +42,8 @@ class ViewController: UIViewController { }) } - - -} - -extension ViewController: UICollectionViewDelegate { - -} - -extension ViewController: UICollectionViewDataSource { - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return 5 - } - - func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "menuCell", for: indexPath) as? MenuCell else { - return UICollectionViewCell() - } - return cell + private func putData() { + self.dataSource.applySnapshot(data: menus.giveMenu()) } + }