From cd6f9325c2b6045ce94e5e35973b561753b21376 Mon Sep 17 00:00:00 2001 From: Yoshitsugu-Antony-Kambara Date: Tue, 2 Mar 2021 18:56:16 +0900 Subject: [PATCH 1/2] =?UTF-8?q?Realm=E7=94=A8=E3=81=AB=E3=82=A4=E3=83=8B?= =?UTF-8?q?=E3=82=B7=E3=83=A3=E3=83=A9=E3=82=A4=E3=82=B6=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E3=81=97=E3=81=A6=E3=81=97=E3=81=BE=E3=81=A3=E3=81=9F?= =?UTF-8?q?=E3=81=8C=E3=80=81=E5=BE=8C=E3=81=BB=E3=81=A9=E5=A4=89=E6=9B=B4?= =?UTF-8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Colombia/Sources/Model/AnnictAPIModel.swift | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Colombia/Sources/Model/AnnictAPIModel.swift b/Colombia/Sources/Model/AnnictAPIModel.swift index 2a5aef6..c332749 100644 --- a/Colombia/Sources/Model/AnnictAPIModel.swift +++ b/Colombia/Sources/Model/AnnictAPIModel.swift @@ -28,6 +28,12 @@ struct Work: Decodable { self.title = try container.decode(String.self, forKey: .title) self.image = try container.decode(Image.self, forKey: .image) } + + init(id: Int, title: String, image: Image) { + self.id = id + self.title = title + self.image = image + } } struct Image: Decodable { @@ -41,4 +47,8 @@ struct Image: Decodable { let container = try decoder.container(keyedBy: Key.self) self.recommendedUrl = try container.decode(String.self, forKey: .recommendedUrl) } + + init(url: String) { + self.recommendedUrl = url + } } From fd631a69010fae6b38cefe4de36fba32f6bb5436 Mon Sep 17 00:00:00 2001 From: Yoshitsugu-Antony-Kambara Date: Tue, 2 Mar 2021 18:59:46 +0900 Subject: [PATCH 2/2] =?UTF-8?q?AnnictAPIModel=E3=81=A7Realm=E7=94=A8?= =?UTF-8?q?=E3=81=AB=E3=82=A4=E3=83=8B=E3=82=B7=E3=83=A3=E3=83=A9=E3=82=A4?= =?UTF-8?q?=E3=82=B6=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=97=E3=81=A6=E3=81=97?= =?UTF-8?q?=E3=81=BE=E3=81=A3=E3=81=9F=E3=81=8C=E5=BE=8C=E3=81=BB=E3=81=A9?= =?UTF-8?q?=E5=A4=89=E6=9B=B4/Realm=E3=81=AB=E8=BF=BD=E5=8A=A0=E5=89=8A?= =?UTF-8?q?=E9=99=A4=E6=A9=9F=E8=83=BD=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../View/Home/WorksIndexViewController.swift | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/Colombia/Sources/View/Home/WorksIndexViewController.swift b/Colombia/Sources/View/Home/WorksIndexViewController.swift index 6d72d8b..b34d9be 100644 --- a/Colombia/Sources/View/Home/WorksIndexViewController.swift +++ b/Colombia/Sources/View/Home/WorksIndexViewController.swift @@ -8,9 +8,13 @@ import UIKit import RxSwift import RxCocoa +import RealmSwift + final class WorksIndexViewController: UIViewController { + var realm: Realm! + private let activityIndicator = UIActivityIndicatorView() private let repository: AnnictDataRepository @@ -58,6 +62,9 @@ final class WorksIndexViewController: UIViewController { super.viewDidLoad() setComponent() + realm = try! Realm() + + //お気に入りの状態に変更があった時 worksIndexModel.favoriteValueChanged .subscribe( @@ -77,12 +84,30 @@ final class WorksIndexViewController: UIViewController { let value = favoriteWorks.value + [work] favoriteWorks.accept(value) // ② work をRealmに新しく追加する + let newRealmWork = RealmWork() + newRealmWork.id = work.id + newRealmWork.title = work.title + newRealmWork.image = work.image.recommendedUrl ?? "undefined" + + try! self.realm.write { + self.realm.add(newRealmWork) + } } else { //お気に入り解除された時 let value = favoriteWorks.value.filter({ $0.id != work.id }) favoriteWorks.accept(value) // ③work をRealmから削除する + //全部取得 + let testRealm = self.realm.objects(RealmWork.self) + //lazyを解消するためにcompactMapしてる + guard let selectedItem = testRealm.filter({ $0.id != work.id }).compactMap({$0}).first else { + return + } + + try! self.realm.write { + self.realm.delete(selectedItem) + } } if callingVC == .favorite { @@ -106,10 +131,13 @@ final class WorksIndexViewController: UIViewController { // ① Realmからデータを取り出す。(API取得の前に行う⇨そのデータを用いてtrueかfalseか判断できるようにするため) // Realm(DB)からお気に入りデータを取り出す。 + let realmData = self.realm.objects(RealmWork.self) // Result -> works [Work] + let favoritesArray: [WorkForDisplay] = realmData.compactMap({ + WorkForDisplay.init(id: $0.id, title: $0.title, image: Image(url: $0.image), isFavorited: $0.isFavorite) + }) - // favoriteWorksの中にそのデータを入れる。 - // worksIndexModel.favoriteWorks.accept(works) + self.worksIndexModel.favoriteWorks.accept(favoritesArray) //21個のアニメのデータを一覧画面用に取得 fetchAPI()