88import UIKit
99import RxSwift
1010import RxCocoa
11+ import RealmSwift
12+
1113
1214final class WorksIndexViewController : UIViewController {
1315
16+ var realm : Realm !
17+
1418 private let activityIndicator = UIActivityIndicatorView ( )
1519
1620 private let repository : AnnictDataRepository
@@ -58,6 +62,9 @@ final class WorksIndexViewController: UIViewController {
5862 super. viewDidLoad ( )
5963 setComponent ( )
6064
65+ realm = try ! Realm ( )
66+
67+
6168 //お気に入りの状態に変更があった時
6269 worksIndexModel. favoriteValueChanged
6370 . subscribe (
@@ -77,12 +84,30 @@ final class WorksIndexViewController: UIViewController {
7784 let value = favoriteWorks. value + [ work]
7885 favoriteWorks. accept ( value)
7986 // ② work をRealmに新しく追加する
87+ let newRealmWork = RealmWork ( )
88+ newRealmWork. id = work. id
89+ newRealmWork. title = work. title
90+ newRealmWork. image = work. image. recommendedUrl ?? " undefined "
91+
92+ try ! self . realm. write {
93+ self . realm. add ( newRealmWork)
94+ }
8095 }
8196 else {
8297 //お気に入り解除された時
8398 let value = favoriteWorks. value. filter ( { $0. id != work. id } )
8499 favoriteWorks. accept ( value)
85100 // ③work をRealmから削除する
101+ //全部取得
102+ let testRealm = self . realm. objects ( RealmWork . self)
103+ //lazyを解消するためにcompactMapしてる
104+ guard let selectedItem = testRealm. filter ( { $0. id != work. id } ) . compactMap ( { $0} ) . first else {
105+ return
106+ }
107+
108+ try ! self . realm. write {
109+ self . realm. delete ( selectedItem)
110+ }
86111 }
87112
88113 if callingVC == . favorite {
@@ -106,10 +131,13 @@ final class WorksIndexViewController: UIViewController {
106131
107132 // ① Realmからデータを取り出す。(API取得の前に行う⇨そのデータを用いてtrueかfalseか判断できるようにするため)
108133 // Realm(DB)からお気に入りデータを取り出す。
134+ let realmData = self . realm. objects ( RealmWork . self)
109135 // Result<AnnictData> -> works [Work]
136+ let favoritesArray : [ WorkForDisplay ] = realmData. compactMap ( {
137+ WorkForDisplay . init ( id: $0. id, title: $0. title, image: Image ( url: $0. image) , isFavorited: $0. isFavorite)
138+ } )
110139
111- // favoriteWorksの中にそのデータを入れる。
112- // worksIndexModel.favoriteWorks.accept(works)
140+ self . worksIndexModel. favoriteWorks. accept ( favoritesArray)
113141
114142 //21個のアニメのデータを一覧画面用に取得
115143 fetchAPI ( )
0 commit comments