Skip to content

Commit b348d91

Browse files
authored
Merge pull request #16 from lauramarson/database
Database
2 parents f427e4f + 3262ccf commit b348d91

12 files changed

Lines changed: 249 additions & 32 deletions

File tree

AnimalsApp/AnimalsApp.xcodeproj/project.pbxproj

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
A463D071285A373800929A3C /* Animals.swift in Sources */ = {isa = PBXBuildFile; fileRef = A463D070285A373700929A3C /* Animals.swift */; };
3636
A463D074285A398900929A3C /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A463D073285A398900929A3C /* HomeViewModel.swift */; };
3737
A463D078285A5A8000929A3C /* OpenSans-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A463D077285A5A8000929A3C /* OpenSans-Regular.ttf */; };
38+
A463D07C285B9B6300929A3C /* CoreData.swift in Sources */ = {isa = PBXBuildFile; fileRef = A463D07B285B9B6300929A3C /* CoreData.swift */; };
3839
A463D07A285B8D8E00929A3C /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = A463D079285B8D8D00929A3C /* Colors.swift */; };
3940
A463D07E285CF28200929A3C /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = A463D07D285CF28200929A3C /* String.swift */; };
4041
/* End PBXBuildFile section */
@@ -95,6 +96,7 @@
9596
A463D070285A373700929A3C /* Animals.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Animals.swift; sourceTree = "<group>"; };
9697
A463D073285A398900929A3C /* HomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = "<group>"; };
9798
A463D077285A5A8000929A3C /* OpenSans-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "OpenSans-Regular.ttf"; sourceTree = "<group>"; };
99+
A463D07B285B9B6300929A3C /* CoreData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreData.swift; sourceTree = "<group>"; };
98100
A463D079285B8D8D00929A3C /* Colors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Colors.swift; sourceTree = "<group>"; };
99101
A463D07D285CF28200929A3C /* String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = String.swift; sourceTree = "<group>"; };
100102
/* End PBXFileReference section */
@@ -175,7 +177,6 @@
175177
A463D0222858EBBD00929A3C /* Assets.xcassets */,
176178
A463D0242858EBBD00929A3C /* LaunchScreen.storyboard */,
177179
A463D0272858EBBD00929A3C /* Info.plist */,
178-
A463D01F2858EBBB00929A3C /* AnimalsApp.xcdatamodeld */,
179180
);
180181
path = AnimalsApp;
181182
sourceTree = "<group>";
@@ -260,6 +261,7 @@
260261
isa = PBXGroup;
261262
children = (
262263
A463D068285A1A5A00929A3C /* WebServices.swift */,
264+
A463D07B285B9B6300929A3C /* CoreData.swift */,
263265
);
264266
path = Services;
265267
sourceTree = "<group>";
@@ -276,6 +278,7 @@
276278
A463D06F285A371F00929A3C /* Models */ = {
277279
isa = PBXGroup;
278280
children = (
281+
A463D01F2858EBBB00929A3C /* AnimalsApp.xcdatamodeld */,
279282
A463D070285A373700929A3C /* Animals.swift */,
280283
);
281284
path = Models;
@@ -563,6 +566,7 @@
563566
buildActionMask = 2147483647;
564567
files = (
565568
A463D06228590D0300929A3C /* Images.swift in Sources */,
569+
A463D07C285B9B6300929A3C /* CoreData.swift in Sources */,
566570
A463D065285953F900929A3C /* AnimalTableViewCell.swift in Sources */,
567571
A463D0212858EBBB00929A3C /* AnimalsApp.xcdatamodeld in Sources */,
568572
A463D0572858F62600929A3C /* RegisterViewController.swift in Sources */,

AnimalsApp/AnimalsApp.xcodeproj/project.pbxproj.orig

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,12 @@
3535
A463D071285A373800929A3C /* Animals.swift in Sources */ = {isa = PBXBuildFile; fileRef = A463D070285A373700929A3C /* Animals.swift */; };
3636
A463D074285A398900929A3C /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A463D073285A398900929A3C /* HomeViewModel.swift */; };
3737
A463D078285A5A8000929A3C /* OpenSans-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A463D077285A5A8000929A3C /* OpenSans-Regular.ttf */; };
38+
<<<<<<< HEAD
39+
A463D07C285B9B6300929A3C /* CoreData.swift in Sources */ = {isa = PBXBuildFile; fileRef = A463D07B285B9B6300929A3C /* CoreData.swift */; };
40+
=======
3841
A463D07A285B8D8E00929A3C /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = A463D079285B8D8D00929A3C /* Colors.swift */; };
42+
A463D07E285CF28200929A3C /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = A463D07D285CF28200929A3C /* String.swift */; };
43+
>>>>>>> develop
3944
/* End PBXBuildFile section */
4045

4146
/* Begin PBXContainerItemProxy section */
@@ -94,7 +99,12 @@
9499
A463D070285A373700929A3C /* Animals.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Animals.swift; sourceTree = "<group>"; };
95100
A463D073285A398900929A3C /* HomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = "<group>"; };
96101
A463D077285A5A8000929A3C /* OpenSans-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "OpenSans-Regular.ttf"; sourceTree = "<group>"; };
102+
<<<<<<< HEAD
103+
A463D07B285B9B6300929A3C /* CoreData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreData.swift; sourceTree = "<group>"; };
104+
=======
97105
A463D079285B8D8D00929A3C /* Colors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Colors.swift; sourceTree = "<group>"; };
106+
A463D07D285CF28200929A3C /* String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = String.swift; sourceTree = "<group>"; };
107+
>>>>>>> develop
98108
/* End PBXFileReference section */
99109

100110
/* Begin PBXFrameworksBuildPhase section */
@@ -173,7 +183,6 @@
173183
A463D0222858EBBD00929A3C /* Assets.xcassets */,
174184
A463D0242858EBBD00929A3C /* LaunchScreen.storyboard */,
175185
A463D0272858EBBD00929A3C /* Info.plist */,
176-
A463D01F2858EBBB00929A3C /* AnimalsApp.xcdatamodeld */,
177186
);
178187
path = AnimalsApp;
179188
sourceTree = "<group>";
@@ -249,6 +258,7 @@
249258
children = (
250259
A463D06128590D0300929A3C /* Images.swift */,
251260
A463D079285B8D8D00929A3C /* Colors.swift */,
261+
A463D07D285CF28200929A3C /* String.swift */,
252262
);
253263
path = DesignSystem;
254264
sourceTree = "<group>";
@@ -257,6 +267,7 @@
257267
isa = PBXGroup;
258268
children = (
259269
A463D068285A1A5A00929A3C /* WebServices.swift */,
270+
A463D07B285B9B6300929A3C /* CoreData.swift */,
260271
);
261272
path = Services;
262273
sourceTree = "<group>";
@@ -273,6 +284,7 @@
273284
A463D06F285A371F00929A3C /* Models */ = {
274285
isa = PBXGroup;
275286
children = (
287+
A463D01F2858EBBB00929A3C /* AnimalsApp.xcdatamodeld */,
276288
A463D070285A373700929A3C /* Animals.swift */,
277289
);
278290
path = Models;
@@ -560,20 +572,19 @@
560572
buildActionMask = 2147483647;
561573
files = (
562574
A463D06228590D0300929A3C /* Images.swift in Sources */,
575+
A463D07C285B9B6300929A3C /* CoreData.swift in Sources */,
563576
A463D065285953F900929A3C /* AnimalTableViewCell.swift in Sources */,
564577
A463D0212858EBBB00929A3C /* AnimalsApp.xcdatamodeld in Sources */,
565578
A463D0572858F62600929A3C /* RegisterViewController.swift in Sources */,
566579
A463D0172858EBBB00929A3C /* AppDelegate.swift in Sources */,
567580
A463D071285A373800929A3C /* Animals.swift in Sources */,
568581
A463D04B2858F39000929A3C /* MainTabBarController.swift in Sources */,
569582
A463D074285A398900929A3C /* HomeViewModel.swift in Sources */,
570-
<<<<<<< HEAD
571583
A463D07A285B8D8E00929A3C /* Colors.swift in Sources */,
572-
=======
573584
5CA996F8285A98FB00FF5D79 /* RegisterViewModel.swift in Sources */,
574-
>>>>>>> develop
575585
A463D05D2858F64B00929A3C /* FavoritesViewController.swift in Sources */,
576586
A463D06D285A22D200929A3C /* DetailViewController.swift in Sources */,
587+
A463D07E285CF28200929A3C /* String.swift in Sources */,
577588
A463D069285A1A5A00929A3C /* WebServices.swift in Sources */,
578589
A463D0532858F60C00929A3C /* HomeViewController.swift in Sources */,
579590
);

AnimalsApp/AnimalsApp/AnimalsApp.xcdatamodeld/AnimalsApp.xcdatamodel/contents

Lines changed: 0 additions & 4 deletions
This file was deleted.

AnimalsApp/AnimalsApp/Models/Animals.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ struct Animal: Codable {
2121
var createdAt: String?
2222
var updatedAt: String?
2323
var isFavorite: Bool? = false
24+
var imageData: Data?
2425

2526
enum CodingKeys: String, CodingKey {
2627
case id
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
//
2+
// Items.swift
3+
// AnimalsApp
4+
//
5+
// Created by Laura Pinheiro Marson on 15/06/22.
6+
//
7+
8+
import Foundation
9+
10+
struct Animals: Codable {
11+
var items: [Animal]
12+
}
13+
14+
struct Animal: Codable {
15+
var id: String?
16+
var name: String?
17+
var description: String?
18+
var age: Int?
19+
var species: String?
20+
var image: String?
21+
var createdAt: String?
22+
var updatedAt: String?
23+
var isFavorite: Bool? = false
24+
<<<<<<< HEAD
25+
var imageData: Data?
26+
=======
27+
28+
enum CodingKeys: String, CodingKey {
29+
case id
30+
case name
31+
case description
32+
case age
33+
case species
34+
case image
35+
case createdAt = "created_at"
36+
case updatedAt = "updated_at"
37+
}
38+
>>>>>>> develop
39+
}
40+
41+
extension Animal {
42+
43+
var imageURL: URL {
44+
guard let imageURL = URL(string: self.image ?? "") else {
45+
return URL(fileURLWithPath: "")
46+
}
47+
return imageURL
48+
}
49+
}

AnimalsApp/AnimalsApp/AnimalsApp.xcdatamodeld/.xccurrentversion renamed to AnimalsApp/AnimalsApp/Models/AnimalsApp.xcdatamodeld/.xccurrentversion

File renamed without changes.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2+
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="20086" systemVersion="21F79" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
3+
<entity name="FavoriteAnimal" representedClassName=".FavoriteAnimal" syncable="YES" codeGenerationType="class">
4+
<attribute name="age" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES"/>
5+
<attribute name="descript" optional="YES" attributeType="String"/>
6+
<attribute name="id" optional="YES" attributeType="String"/>
7+
<attribute name="image" optional="YES" attributeType="Binary"/>
8+
<attribute name="name" optional="YES" attributeType="String"/>
9+
<attribute name="species" optional="YES" attributeType="String"/>
10+
</entity>
11+
<elements>
12+
<element name="FavoriteAnimal" positionX="-63" positionY="-18" width="128" height="119"/>
13+
</elements>
14+
</model>
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
//
2+
// CoreData.swift
3+
// AnimalsApp
4+
//
5+
// Created by Laura Pinheiro Marson on 16/06/22.
6+
//
7+
8+
import UIKit
9+
import CoreData
10+
11+
protocol CoreDataContract: AnyObject {
12+
func loadFavoriteAnimals(completion: @escaping () -> ())
13+
func isFavorite(id: String) -> Bool
14+
func addFavorite(_ animal: Animal)
15+
func removeFavorite(id: String)
16+
func saveChanges()
17+
}
18+
19+
class CoreData: CoreDataContract {
20+
var managedContext: NSManagedObjectContext?
21+
var favoriteAnimals = [FavoriteAnimal]()
22+
23+
init() {
24+
managedContext = (UIApplication.shared.delegate as? AppDelegate)?
25+
.persistentContainer
26+
.viewContext
27+
}
28+
29+
func loadFavoriteAnimals(completion: @escaping () -> ()) {
30+
guard let managedContext = managedContext else { return }
31+
32+
let fetchRequest: NSFetchRequest<FavoriteAnimal> = FavoriteAnimal.fetchRequest()
33+
34+
do {
35+
favoriteAnimals = try managedContext.fetch(fetchRequest)
36+
completion()
37+
} catch let error as NSError {
38+
print("Could not fetch. \(error), \(error.userInfo)")
39+
}
40+
}
41+
42+
func isFavorite(id: String) -> Bool {
43+
44+
for animal in favoriteAnimals {
45+
if animal.id == id {
46+
return true
47+
}
48+
}
49+
return false
50+
}
51+
52+
func addFavorite(_ animal: Animal) {
53+
54+
guard let managedContext = managedContext else { return }
55+
56+
let newFavoriteAnimal = FavoriteAnimal(context: managedContext)
57+
newFavoriteAnimal.id = animal.id
58+
newFavoriteAnimal.name = animal.name
59+
newFavoriteAnimal.image = animal.imageData
60+
newFavoriteAnimal.descript = animal.description
61+
newFavoriteAnimal.age = Int32(animal.age ?? 0)
62+
newFavoriteAnimal.species = animal.species
63+
self.favoriteAnimals.append(newFavoriteAnimal)
64+
}
65+
66+
func removeFavorite(id: String) {
67+
68+
guard let managedContext = managedContext else { return }
69+
70+
var count = 0
71+
72+
for animal in favoriteAnimals {
73+
if animal.id == id {
74+
let removeAnimal = animal
75+
favoriteAnimals.remove(at: count)
76+
managedContext.delete(removeAnimal)
77+
}
78+
count += 1
79+
}
80+
81+
}
82+
83+
func saveChanges() {
84+
do {
85+
try self.managedContext?.save()
86+
} catch let error as NSError {
87+
print("Could not save. \(error), \(error.userInfo)")
88+
}
89+
}
90+
}

AnimalsApp/AnimalsApp/View Models/HomeViewModel.swift

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ import Foundation
99

1010
class HomeViewModel {
1111
private var webServices: WebServicesContract
12+
private var coreData: CoreDataContract
1213
var animals = [Animal]()
1314

14-
init(webServices: WebServicesContract = WebServices()) {
15+
init(webServices: WebServicesContract = WebServices(), coreData: CoreDataContract = CoreData()) {
1516
self.webServices = webServices
17+
self.coreData = coreData
1618
}
1719

1820
func numberOfRows() -> Int {
@@ -28,6 +30,7 @@ class HomeViewModel {
2830
switch result {
2931
case .success(let animals):
3032
self?.handleAnimalResponse(with: animals)
33+
self?.setFavorite()
3134
case .failure(let error):
3235
//obs criar alerta
3336
print(error.localizedDescription)
@@ -45,4 +48,33 @@ class HomeViewModel {
4548
return false
4649
}
4750
}
51+
52+
//MARK: Core Data Methods
53+
54+
private func setFavorite() {
55+
for (index, animal) in animals.enumerated() {
56+
guard let id = animal.id else { return }
57+
animals[index].isFavorite = coreData.isFavorite(id: id)
58+
}
59+
}
60+
61+
func addOrRemoveFavorite(at index: Int, with image: Data) {
62+
animals[index].imageData = image
63+
64+
guard let isFavorite = animals[index].isFavorite,
65+
let id = animals[index].id else { return }
66+
isFavorite ? coreData.removeFavorite(id: id) : coreData.addFavorite(animals[index])
67+
68+
animals[index].isFavorite = !isFavorite
69+
}
70+
71+
func loadFavorites(completion: @escaping () -> ()) {
72+
coreData.loadFavoriteAnimals {
73+
completion()
74+
}
75+
}
76+
77+
func saveChangesInCoreData() {
78+
coreData.saveChanges()
79+
}
4880
}

0 commit comments

Comments
 (0)