0% found this document useful (0 votes)
6 views8 pages

URLSession - Itunes Search API - SwiftBookRu

q

Uploaded by

mikegan888
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
6 views8 pages

URLSession - Itunes Search API - SwiftBookRu

q

Uploaded by

mikegan888
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 8

//

// SearchResponse.swift
// JSONWebinar
//
// Created by Алексей Пархоменко on 06/10/2019.
// Copyright © 2019 Алексей Пархоменко. All rights reserved.
//

import Foundation

struct SearchResponse: Decodable {


var resultCount: Int
var results: [Track]
}

struct Track: Decodable {


var trackName: String
var collectionName: String?
var artistName: String
var artworkUrl60: String?
}

//
// ViewController.swift
// JSONWebinar
//
// Created by Алексей Пархоменко on 06/10/2019.
// Copyright © 2019 Алексей Пархоменко. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

let networkDataFetcher = NetworkDataFetcher()


var searchResponse: SearchResponse? = nil
private var timer: Timer?
let searchController = UISearchController(searchResultsController: nil)

@IBOutlet weak var table: UITableView!

override func viewDidLoad(){


super.viewDidLoad()

setupTableView()
setupSearchBar()
//https://itunes.apple.com/search?term=jack+johnson
}
private func setupSearchBar() {
navigationItem.searchController = searchController
searchController.searchBar.delegate = self
navigationController?.navigationBar.prefersLargeTitles = true
searchController.obscuresBackgroundDuringPresentation = false
}

private func setupTableView() {


table.delegate = self
table.dataSource = self
table.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
}
}

// MARK: - UITableViewDelegate, UITableViewDataSource


extension ViewController: UITableViewDelegate, UITableViewDataSource {

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {


return searchResponse?.results.count ?? 0
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->


UITableViewCell {
let cell = table.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
let track = searchResponse?.results[indexPath.row]
print("track?.artworkUrl60:", track?.artworkUrl60)
cell.textLabel?.text = track?.trackName
return cell
}
}

// MARK: - UISearchBarDelegate

extension ViewController: UISearchBarDelegate {


func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
let urlString = "https://itunes.apple.com/search?term=\(searchText)&limit=5"

timer?.invalidate()
timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false, block: { (_) in
self.networkDataFetcher.fetchTracks(urlString: urlString) { (searchResponse) in
guard let searchResponse = searchResponse else { return }
self.searchResponse = searchResponse
self.table.reloadData()
}

})

}
}
//
// NetworkService.swift
// JSONWebinar
//
// Created by Алексей Пархоменко on 06/10/2019.
// Copyright © 2019 Алексей Пархоменко. All rights reserved.
//

import Foundation

class NetworkService {

func request(urlString: String, completion: @escaping (Result<Data, Error>) -> Void) {


guard let url = URL(string: urlString) else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
DispatchQueue.main.async {
if let error = error {
completion(.failure(error))
return
}
guard let data = data else { return }
completion(.success(data))
}
}.resume()
}
}

//
// NetworkDataFetcher.swift
// JSONWebinar
//
// Created by Алексей Пархоменко on 06/10/2019.
// Copyright © 2019 Алексей Пархоменко. All rights reserved.
//

import Foundation

class NetworkDataFetcher {

let networkService = NetworkService()

func fetchTracks(urlString: String, response: @escaping (SearchResponse?) -> Void) {


networkService.request(urlString: urlString) { (result) in
switch result {
case .success(let data):
do {
let tracks = try JSONDecoder().decode(SearchResponse.self, from: data)
response(tracks)
} catch let jsonError {
print("Failed to decode JSON", jsonError)
response(nil)
}
case .failure(let error):
print("Error received requesting data: \(error.localizedDescription)")
response(nil)
}
}
}
}

—————————————————————————————————————————————————————————————————————————————————————————-
import UIKit

class ViewController: UIViewController {

@IBOutlet weak var table: UITableView!


let searchController = UISearchController(searchResultsController: nil)

override func viewDidLoad(){


super.viewDidLoad()
setupTableView()
setupSearchBar()
//https://itunes.apple.com/search?term=jack+johnson

let urlString = "https://itunes.apple.com/search?term=\(searchText)&limit=5"

guard let url = URL(string: urlString) else { return }


URLSession.shared.dataTask(with: url) { (data, response, error) in
DispatchQueue.main.async {
if let error = error {
print(“some error”)
return
}
guard let data = data else { return }
let someString = String(data: data, encoding: .utf8)
print(some string ?? “No data”)
}
}.resume()

You might also like