Skip to content

Instantly share code, notes, and snippets.

View zafarivaev's full-sized avatar
🎯
Focusing

Zafar Ivaev zafarivaev

🎯
Focusing
View GitHub Profile
import UIKit
// MARK: View Input (View -> Presenter)
protocol ViewToPresenterQuotesProtocol {
var view: PresenterToViewQuotesProtocol? { get set }
var interactor: PresenterToInteractorQuotesProtocol? { get set }
var router: PresenterToRouterQuotesProtocol? { get set }
var quotesStrings: [String]? { get set }
func viewDidLoad()
func refresh()
class QuotesPresenter: ViewToPresenterQuotesProtocol {
// MARK: Properties
weak var view: PresenterToViewQuotesProtocol?
var interactor: PresenterToInteractorQuotesProtocol?
var router: PresenterToRouterQuotesProtocol?
var quotesStrings: [String]?
// MARK: Inputs from view
extension QuotesViewController: PresenterToViewQuotesProtocol{
func onFetchQuotesSuccess() {
print("View receives the response from Presenter and updates itself.")
self.tableView.reloadData()
self.refreshControl.endRefreshing()
}
func onFetchQuotesFailure(error: String) {
print("View receives the response from Presenter with error: \(error)")
import Foundation
class QuotesInteractor: PresenterToInteractorQuotesProtocol {
// MARK: Properties
weak var presenter: InteractorToPresenterQuotesProtocol?
var quotes: [APIQuote]?
func loadQuotes() {
print("Interactor receives the request from Presenter to load quotes from the server.")
extension QuotesPresenter: InteractorToPresenterQuotesProtocol {
func fetchQuotesSuccess(quotes: [APIQuote]) {
print("Presenter receives the result from Interactor after it's done its job.")
self.quotesStrings = quotes.compactMap { $0.quote }
view?.hideHUD()
view?.onFetchQuotesSuccess()
}
func fetchQuotesFailure(errorCode: Int) {
import UIKit
class QuotesRouter: PresenterToRouterQuotesProtocol {
// MARK: Static methods
static func createModule() -> UINavigationController {
print("QuotesRouter creates the Quotes module.")
let viewController = QuotesViewController()
let navigationController = UINavigationController(rootViewController: viewController)
// MARK: View Input (View -> Presenter)
protocol ViewToPresenterQuoteDetailProtocol {
var view: PresenterToViewQuoteDetailProtocol? { get set }
var interactor: PresenterToInteractorQuoteDetailProtocol? { get set }
var router: PresenterToRouterQuoteDetailProtocol? { get set }
func viewDidLoad()
}
// MARK: View Output (Presenter -> View)
protocol PresenterToViewQuoteDetailProtocol {
class QuoteDetailViewController: UIViewController {
// MARK: - Lifecycle Methods
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
presenter?.viewDidLoad()
}
class QuoteDetailPresenter: ViewToPresenterQuoteDetailProtocol {
// MARK: Properties
weak var view: PresenterToViewQuoteDetailProtocol?
var interactor: PresenterToInteractorQuoteDetailProtocol?
var router: PresenterToRouterQuoteDetailProtocol?
func viewDidLoad() {
print("Presenter is being notified that the View was loaded.")
interactor?.getImageDataFromURL()
class QuoteDetailInteractor: PresenterToInteractorQuoteDetailProtocol {
// MARK: Properties
weak var presenter: InteractorToPresenterQuoteDetailProtocol?
var quote: APIQuote?
func getImageDataFromURL() {
print("Interactor receives the request from Presenter to get image data from the server.")
KingfisherService.shared.loadImageFrom(urlString: quote!.image!, success: { (data) in
self.presenter?.getImageFromURLSuccess(quote: self.quote!, data: data)