aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Tay <nick@windblume.net>2022-03-24 17:07:51 +1100
committerNicholas Tay <nick@windblume.net>2022-03-24 17:07:51 +1100
commitd8624dbf8a9111f931802cbb2759ebd009096552 (patch)
treec0154b234a8274374aada77fd7a63d5dabf00e7e
parent1b292bc251b3dbef532dacad9705bd197ac4227b (diff)
downloadforayios-d8624dbf8a9111f931802cbb2759ebd009096552.tar.gz
forayios-d8624dbf8a9111f931802cbb2759ebd009096552.tar.bz2
forayios-d8624dbf8a9111f931802cbb2759ebd009096552.zip
First attempt at Presenter
This is admittedly pretty hard for me to wrap my head around, and I'm not even using background threading explicitly yet. Will improve.
-rw-r--r--foray.xcodeproj/project.pbxproj24
-rw-r--r--foray/Coordinators/ForayCoordinator.swift6
-rw-r--r--foray/ForayItems.swift25
-rw-r--r--foray/ForayModels.swift20
-rw-r--r--foray/ForayViewModels.swift16
-rw-r--r--foray/Presenters/PenguinItemPresenter.swift32
-rw-r--r--foray/Scenes/ForayTableViewController.swift40
7 files changed, 108 insertions, 55 deletions
diff --git a/foray.xcodeproj/project.pbxproj b/foray.xcodeproj/project.pbxproj
index e25da72..176b21c 100644
--- a/foray.xcodeproj/project.pbxproj
+++ b/foray.xcodeproj/project.pbxproj
@@ -8,7 +8,7 @@
/* Begin PBXBuildFile section */
C011E4F127E6211400C248D6 /* ForayNetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C011E4F027E6211400C248D6 /* ForayNetworkManager.swift */; };
- C011E4F327E6216C00C248D6 /* ForayItems.swift in Sources */ = {isa = PBXBuildFile; fileRef = C011E4F227E6216C00C248D6 /* ForayItems.swift */; };
+ C011E4F327E6216C00C248D6 /* ForayModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = C011E4F227E6216C00C248D6 /* ForayModels.swift */; };
C049BBFE27E82B9E003820A9 /* Coordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C049BBFD27E82B9E003820A9 /* Coordinator.swift */; };
C049BC0027E82C90003820A9 /* ForayCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C049BBFF27E82C90003820A9 /* ForayCoordinator.swift */; };
C04B45A427DEF117001451A3 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C04B45A327DEF117001451A3 /* AppDelegate.swift */; };
@@ -20,12 +20,14 @@
C09676BA27E86B6E00353D46 /* ForayLoadingOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = C09676B927E86B6E00353D46 /* ForayLoadingOverlay.swift */; };
C09676BC27EC27E700353D46 /* UIViewController+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C09676BB27EC27E700353D46 /* UIViewController+Extensions.swift */; };
C09676BE27EC28B100353D46 /* ForayDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C09676BD27EC28B100353D46 /* ForayDetailView.swift */; };
+ C0C73E6427EC3A650015497D /* ForayViewModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0C73E6327EC3A650015497D /* ForayViewModels.swift */; };
+ C0C73E6727EC3BA50015497D /* PenguinItemPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0C73E6627EC3BA50015497D /* PenguinItemPresenter.swift */; };
C0FEAF5F27E14C52000A7648 /* ForayDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0FEAF5E27E14C52000A7648 /* ForayDetailViewController.swift */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
C011E4F027E6211400C248D6 /* ForayNetworkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForayNetworkManager.swift; sourceTree = "<group>"; };
- C011E4F227E6216C00C248D6 /* ForayItems.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForayItems.swift; sourceTree = "<group>"; };
+ C011E4F227E6216C00C248D6 /* ForayModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForayModels.swift; sourceTree = "<group>"; };
C049BBFD27E82B9E003820A9 /* Coordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Coordinator.swift; sourceTree = "<group>"; };
C049BBFF27E82C90003820A9 /* ForayCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForayCoordinator.swift; sourceTree = "<group>"; };
C04B45A027DEF117001451A3 /* foray.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = foray.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -38,6 +40,8 @@
C09676B927E86B6E00353D46 /* ForayLoadingOverlay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForayLoadingOverlay.swift; sourceTree = "<group>"; };
C09676BB27EC27E700353D46 /* UIViewController+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Extensions.swift"; sourceTree = "<group>"; };
C09676BD27EC28B100353D46 /* ForayDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForayDetailView.swift; sourceTree = "<group>"; };
+ C0C73E6327EC3A650015497D /* ForayViewModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForayViewModels.swift; sourceTree = "<group>"; };
+ C0C73E6627EC3BA50015497D /* PenguinItemPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PenguinItemPresenter.swift; sourceTree = "<group>"; };
C0FEAF5E27E14C52000A7648 /* ForayDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForayDetailViewController.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
@@ -72,12 +76,14 @@
C04B45A227DEF117001451A3 /* foray */ = {
isa = PBXGroup;
children = (
+ C0C73E6527EC3B8F0015497D /* Presenters */,
C09676C327EC358F00353D46 /* Coordinators */,
C09676C227EC354700353D46 /* Extensions */,
C09676C127EC353D00353D46 /* Scenes */,
C04B45A327DEF117001451A3 /* AppDelegate.swift */,
C04B45A527DEF117001451A3 /* SceneDelegate.swift */,
- C011E4F227E6216C00C248D6 /* ForayItems.swift */,
+ C011E4F227E6216C00C248D6 /* ForayModels.swift */,
+ C0C73E6327EC3A650015497D /* ForayViewModels.swift */,
C011E4F027E6211400C248D6 /* ForayNetworkManager.swift */,
C04B45AC27DEF118001451A3 /* Assets.xcassets */,
C04B45B127DEF118001451A3 /* Info.plist */,
@@ -114,6 +120,14 @@
path = Coordinators;
sourceTree = "<group>";
};
+ C0C73E6527EC3B8F0015497D /* Presenters */ = {
+ isa = PBXGroup;
+ children = (
+ C0C73E6627EC3BA50015497D /* PenguinItemPresenter.swift */,
+ );
+ path = Presenters;
+ sourceTree = "<group>";
+ };
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -195,11 +209,13 @@
C09676BE27EC28B100353D46 /* ForayDetailView.swift in Sources */,
C04B45B827DEF2ED001451A3 /* ForayTableViewController.swift in Sources */,
C0FEAF5F27E14C52000A7648 /* ForayDetailViewController.swift in Sources */,
+ C0C73E6427EC3A650015497D /* ForayViewModels.swift in Sources */,
C04EDE4427E4298D00D83005 /* ForayNewTableViewCell.swift in Sources */,
C09676BC27EC27E700353D46 /* UIViewController+Extensions.swift in Sources */,
C04B45A427DEF117001451A3 /* AppDelegate.swift in Sources */,
C09676BA27E86B6E00353D46 /* ForayLoadingOverlay.swift in Sources */,
- C011E4F327E6216C00C248D6 /* ForayItems.swift in Sources */,
+ C011E4F327E6216C00C248D6 /* ForayModels.swift in Sources */,
+ C0C73E6727EC3BA50015497D /* PenguinItemPresenter.swift in Sources */,
C04B45A627DEF117001451A3 /* SceneDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
diff --git a/foray/Coordinators/ForayCoordinator.swift b/foray/Coordinators/ForayCoordinator.swift
index 6497ec0..6c4bb3f 100644
--- a/foray/Coordinators/ForayCoordinator.swift
+++ b/foray/Coordinators/ForayCoordinator.swift
@@ -33,7 +33,7 @@ class ForayCoordinator: Coordinator {
let detailViewController = ForayDetailViewController()
- func showDetails(item: PenguinItem) {
+ func showDetails(item: PenguinItemViewModel) {
let image: UIImage
var description: String = "Type: "
switch item.type {
@@ -45,9 +45,7 @@ class ForayCoordinator: Coordinator {
image = UIImage(named: "spy")!
}
description += "\nID: " + item.id
- let dateFormatter = DateFormatter()
- dateFormatter.dateFormat = "yyyy-MM-dd"
- description += "\nReleased: " + dateFormatter.string(from: item.releaseDate)
+ description += "\nReleased: " + item.releaseDateFormatted
detailViewController.setDetails(name: item.name, description: description, image: image)
push(vc: detailViewController)
diff --git a/foray/ForayItems.swift b/foray/ForayItems.swift
deleted file mode 100644
index a8786ee..0000000
--- a/foray/ForayItems.swift
+++ /dev/null
@@ -1,25 +0,0 @@
-//
-// ForayItems.swift
-// foray
-//
-// Created by Nicholas Tay on 20/3/2022.
-//
-
-import Foundation
-
-enum ItemType: String, Decodable {
- case item
- case quest
-}
-
-struct YearSection {
- var year: Int
- var items: [PenguinItem]
-}
-
-struct PenguinItem: Decodable {
- var type: ItemType
- var releaseDate: Date
- var id: String
- var name: String
-}
diff --git a/foray/ForayModels.swift b/foray/ForayModels.swift
new file mode 100644
index 0000000..c721b95
--- /dev/null
+++ b/foray/ForayModels.swift
@@ -0,0 +1,20 @@
+//
+// ForayItems.swift
+// foray
+//
+// Created by Nicholas Tay on 20/3/2022.
+//
+
+import Foundation
+
+enum PenguinItemType: String, Decodable {
+ case item
+ case quest
+}
+
+struct PenguinItemModel: Decodable {
+ let type: PenguinItemType
+ let releaseDate: Date
+ let id: String
+ let name: String
+}
diff --git a/foray/ForayViewModels.swift b/foray/ForayViewModels.swift
new file mode 100644
index 0000000..9b9b058
--- /dev/null
+++ b/foray/ForayViewModels.swift
@@ -0,0 +1,16 @@
+//
+// ForayViewModels.swift
+// foray
+//
+// Created by Nicholas Tay on 24/3/2022.
+//
+
+import Foundation
+
+struct PenguinItemViewModel {
+ let type: PenguinItemType
+ let releaseDateFormatted: String
+ let year: Int
+ let id: String
+ let name: String
+}
diff --git a/foray/Presenters/PenguinItemPresenter.swift b/foray/Presenters/PenguinItemPresenter.swift
new file mode 100644
index 0000000..0420825
--- /dev/null
+++ b/foray/Presenters/PenguinItemPresenter.swift
@@ -0,0 +1,32 @@
+//
+// PenguinItemPresenter.swift
+// foray
+//
+// Created by Nicholas Tay on 24/3/2022.
+//
+
+import Foundation
+
+class PenguinItemPresenter {
+ func getData(onComplete: @escaping ([PenguinItemViewModel]) -> ()) {
+ ForayNetworkManager.shared.get(
+ url: "https://users.windblume.net/~nick/upload/dummy.json",
+ onComplete: { (apiItems: [PenguinItemModel]) in
+ onComplete(self.transform(models: apiItems))
+ })
+ }
+
+ func transform(models: [PenguinItemModel]) -> [PenguinItemViewModel] {
+ let dateFormatter = DateFormatter()
+ dateFormatter.dateFormat = "yyyy-MM-dd"
+
+ return models
+ .sorted { $0.releaseDate < $1.releaseDate }
+ .map {
+ PenguinItemViewModel(type: $0.type,
+ releaseDateFormatted: dateFormatter.string(from: $0.releaseDate),
+ year: Calendar.current.component(.year, from: $0.releaseDate),
+ id: $0.id, name: $0.name)
+ }
+ }
+}
diff --git a/foray/Scenes/ForayTableViewController.swift b/foray/Scenes/ForayTableViewController.swift
index 37ac2e5..ed44139 100644
--- a/foray/Scenes/ForayTableViewController.swift
+++ b/foray/Scenes/ForayTableViewController.swift
@@ -7,8 +7,14 @@
import UIKit
+struct YearSection {
+ var year: Int
+ var items: [PenguinItemViewModel]
+}
+
class ForayTableViewController: UITableViewController, ForayCoordinated {
+ let presenter: PenguinItemPresenter = PenguinItemPresenter()
var coordinator: ForayCoordinator?
// MARK: - Static data TEMP
@@ -39,28 +45,18 @@ class ForayTableViewController: UITableViewController, ForayCoordinated {
}
func reloadApiData() {
- ForayNetworkManager.shared.get(
- url: "https://users.windblume.net/~nick/upload/dummy.json",
- onComplete: { (apiItems: [PenguinItem]) in
- var items = apiItems
-
- // Show items in chronological order within sections
- items.sort { (lhs, rhs) in lhs.releaseDate < rhs.releaseDate }
-
- // Group by year sections
- let groups = Dictionary(grouping: apiItems) { (item) in
- return Calendar.current.component(.year, from: item.releaseDate)
- }
- self.sections = groups.map { (key, values) in
- return YearSection(year: key, items: values)
- }
- // Sort the sections from oldest year to newest
- self.sections.sort { (lhs, rhs) in lhs.year < rhs.year }
-
- self.tableView.reloadData()
- self.refreshControl?.endRefreshing()
- self.coordinator?.hideLoading()
- })
+ presenter.getData(onComplete: { (data: [PenguinItemViewModel]) in
+ let groups = Dictionary(grouping: data) { $0.year }
+ self.sections = groups.map { (key, values) in
+ return YearSection(year: key, items: values)
+ }
+ // Sort the sections from oldest year to newest
+ self.sections.sort { (lhs, rhs) in lhs.year < rhs.year }
+
+ self.tableView.reloadData()
+ self.refreshControl?.endRefreshing()
+ self.coordinator?.hideLoading()
+ })
}
// MARK: - Table view data source