Skip to content

Instantly share code, notes, and snippets.

@gordinmitya
Created October 17, 2018 10:51
Show Gist options
  • Save gordinmitya/7ba9ea5c61b0c75411fd193abb6d72d4 to your computer and use it in GitHub Desktop.
Save gordinmitya/7ba9ea5c61b0c75411fd193abb6d72d4 to your computer and use it in GitHub Desktop.
//
// 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