Created
October 17, 2018 10:51
-
-
Save gordinmitya/7ba9ea5c61b0c75411fd193abb6d72d4 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// ComputerDetailViewController.swift | |
// Computers | |
// | |
// Created by Гоша Бодров on 24.07.2018. | |
// Copyright © 2018 Гоша Бодров. All rights reserved. | |
// | |
import UIKit | |
class ComputerDetailViewController: UIViewController { | |
@IBOutlet weak var scrollView: UIScrollView! | |
@IBOutlet weak var similarComputer0: UIButton! | |
@IBOutlet weak var similarComputer1: UIButton! | |
@IBOutlet weak var similarComputer2: UIButton! | |
@IBOutlet weak var detailLabelHeightConstraintCompany: NSLayoutConstraint! | |
@IBOutlet weak var detailLabelHeightConstraintDate: NSLayoutConstraint! | |
@IBOutlet weak var detailLabelTopConstraintDiscription: NSLayoutConstraint! | |
@IBOutlet weak var detailLabelTopConstraintDate: NSLayoutConstraint! | |
@IBOutlet weak var detailHeightImage: NSLayoutConstraint! | |
@IBOutlet weak var detailTopConstraintImage: NSLayoutConstraint! | |
@IBOutlet weak var detailImageView: UIImageView! | |
@IBOutlet weak var detailLabelCompany: UILabel! | |
@IBOutlet weak var detailLabelDate: UILabel! | |
@IBOutlet weak var detailLabelDescription: UILabel! | |
@IBOutlet weak var detailLabelHeightDescription: NSLayoutConstraint! | |
private let urlString = "http://testwork.nsd.naumen.ru/rest/computers/" | |
var computerId: Int = 0 | |
var companyName: String = "" | |
var similarComputers: [Computer] = [] | |
override func viewDidLoad() { | |
super.viewDidLoad() | |
scrollView.delegate = self | |
self.navigationItem.title = companyName | |
fetchDetailComputers(forId: computerId) | |
fetchSimilarComputers(forId: computerId) | |
} | |
private func fetchDetailComputers(forId id: Int) { | |
guard let url = url(forPage: computerId) else {return} | |
URLSession.shared.dataTask(with: url) { (data, response, error) in | |
guard error == nil else { print(NetworkError.failInternetError) | |
return } | |
guard let data = data else { print("No similar computers") | |
return } | |
guard error == nil else { return } | |
do { | |
let dataAboutDetailComputerParsing = try JSONDecoder().decode(DetailAboutComputer.self, from: data) | |
print(dataAboutDetailComputerParsing) | |
DispatchQueue.main.async{ | |
print("Begin of code") | |
if dataAboutDetailComputerParsing.imageUrl != nil{ | |
if let url = URL(string: dataAboutDetailComputerParsing.imageUrl!) { | |
self.downloadImage(url: url) | |
self.detailImageView.contentMode = .scaleAspectFit | |
self.setTopConstraintImage(isHidden: false) | |
self.setHeightImage(isHidden: false) | |
} else { | |
self.clearImage() | |
} | |
} else { | |
self.clearImage() | |
} | |
print("End of code. The image will continue downloading in the background and it will be loaded when it ends.") | |
if dataAboutDetailComputerParsing.company?.name != nil{ | |
self.setCompanyLabel(isHidden: false) | |
self.setTopConstraintDateLabel(isHidden: false) | |
self.detailLabelCompany.text = dataAboutDetailComputerParsing.company?.name | |
} else { | |
self.setCompanyLabel(isHidden: true) | |
self.setTopConstraintDateLabel(isHidden: true) | |
} | |
if dataAboutDetailComputerParsing.introduced != nil{ | |
self.setDateLabel(isHidden: false) | |
self.setTopConstraintDiscriptionLabel(isHidden: false) | |
self.detailLabelDate.text = dataAboutDetailComputerParsing.introduced | |
} else { | |
self.setDateLabel(isHidden: true) | |
self.setTopConstraintDiscriptionLabel(isHidden: true) | |
} | |
if dataAboutDetailComputerParsing.description != nil { | |
self.setDescriptionLabel(isHidden: false) | |
self.detailLabelDescription.text = dataAboutDetailComputerParsing.description | |
} else { | |
self.setDescriptionLabel(isHidden: true) | |
} | |
} | |
} catch let error { | |
print(error) | |
} | |
}.resume() | |
} | |
private func fetchSimilarComputers(forId id: Int) { | |
guard let url = urlForSimilar(forPage: id) else {return} | |
URLSession.shared.dataTask(with: url) { [weak self](data, response, error) in | |
guard let data = data else { return } | |
guard error == nil else { return } | |
do { | |
let similarComputers = try JSONDecoder().decode([Computer].self, from: data) | |
print(similarComputers) | |
self?.similarComputers = similarComputers | |
DispatchQueue.main.async { | |
// TODO: Show similar computers | |
self?.updateSimilarComputersButton(withComputers: similarComputers) | |
} | |
} catch let error { | |
print(error) | |
} | |
}.resume() | |
} | |
func updateSimilarComputersButton(withComputers computers: [Computer]) { | |
let number = computers.count | |
if number >= 1 { | |
similarComputer0.setTitle(computers[0].name, for: .normal) | |
similarComputer0.isEnabled = true | |
} else { | |
similarComputer0.setTitle("", for: .normal) | |
similarComputer0.isEnabled = false | |
} | |
if number >= 2 { | |
similarComputer1.setTitle(computers[1].name, for: .normal) | |
similarComputer1.isEnabled = true | |
} else { | |
similarComputer1.setTitle("", for: .normal) | |
similarComputer1.isEnabled = false | |
} | |
if number >= 3 { | |
similarComputer2.setTitle(computers[2].name, for: .normal) | |
similarComputer2.isEnabled = true | |
} else { | |
similarComputer2.setTitle("", for: .normal) | |
similarComputer2.isEnabled = false | |
} | |
} | |
private func urlForSimilar(forPage page: Int) -> URL? { | |
return URL(string: urlString+"\(page)"+"/similar") | |
} | |
private func url(forPage page: Int) -> URL? { | |
return URL(string: urlString+"\(page)") | |
} | |
// Size constraint | |
private func setCompanyLabel(isHidden: Bool) { | |
detailLabelHeightConstraintCompany.constant = isHidden ? 0.0 : 41.0 | |
self.view.layoutIfNeeded() | |
} | |
private func setDateLabel(isHidden: Bool) { | |
detailLabelHeightConstraintDate.constant = isHidden ? 0.0 : 41.0 | |
self.view.layoutIfNeeded() | |
} | |
private func setTopConstraintDateLabel(isHidden: Bool) { | |
detailLabelTopConstraintDate.constant = isHidden ? 0.0 : 20.0 | |
self.view.layoutIfNeeded() | |
} | |
private func setDescriptionLabel(isHidden: Bool) { | |
detailLabelHeightDescription.constant = isHidden ? 0.0 : 41.0 | |
self.view.layoutIfNeeded() | |
} | |
private func setTopConstraintDiscriptionLabel(isHidden: Bool) { | |
detailLabelTopConstraintDiscription.constant = isHidden ? 0.0 : 20.0 | |
self.view.layoutIfNeeded() | |
} | |
private func setHeightImage(isHidden: Bool) { | |
detailHeightImage.constant = isHidden ? 0.0 : 210.0 | |
self.view.layoutIfNeeded() | |
} | |
private func setTopConstraintImage(isHidden: Bool) { | |
detailTopConstraintImage.constant = isHidden ? 0.0 : 35.0 | |
self.view.layoutIfNeeded() | |
} | |
// Download img from URL | |
func getDataFromUrl(url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> ()) { | |
URLSession.shared.dataTask(with: url) { data, response, error in | |
completion(data, response, error) | |
}.resume() | |
} | |
func downloadImage(url: URL) { | |
print("Download Started") | |
getDataFromUrl(url: url) { data, response, error in | |
guard let data = data, error == nil else { | |
self.clearImage() | |
return } | |
print(response?.suggestedFilename ?? url.lastPathComponent) | |
print("Download Finished") | |
DispatchQueue.main.async() { | |
if UIImage(data: data) != nil{ | |
self.detailImageView.image = UIImage(data: data) | |
} else { | |
self.clearImage() | |
} | |
} | |
} | |
} | |
func clearImage(){ | |
DispatchQueue.main.async{ | |
self.detailImageView.image = nil | |
self.setTopConstraintImage(isHidden: true) | |
self.setHeightImage(isHidden: true) | |
self.view.layoutIfNeeded() | |
} | |
} | |
// Actions | |
@IBAction func similarComputerTouched(_ sender: UIButton) { | |
let index = sender.tag | |
guard self.similarComputers.count > index else { return } // Количество элементов должно быть как минимум на 1 больше чем index (в массиве из 3-х элементов максимальный индекс 2) | |
let computer = similarComputers[index] | |
self.computerId = computer.id | |
self.companyName = computer.name | |
self.navigationItem.title = companyName | |
clearImage() | |
fetchDetailComputers(forId: computerId) | |
fetchSimilarComputers(forId: computerId) | |
DispatchQueue.main.async{ | |
print("Scroll to top") | |
self.scrollView.setContentOffset(CGPoint.init(x: 0.0, y: -64.0), animated: true) | |
} | |
} | |
} | |
extension ComputerDetailViewController: UIScrollViewDelegate { | |
func scrollViewDidScroll(_ scrollView: UIScrollView) { | |
// print("Scroll view content offset = \(scrollView.contentOffset)") | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment