#Swift, to supporting decoding and encoding we must adopt the #NSCoding protocol and implement its methods.
#Apple has introduced a new way to decode and encode the #JSON data using with Codable since Swift 4.
You need to consume the following API to search and display images. - Flickr
Https://www.flickr.com/services/api/flickr.photos.search.htm The API results in search results for a
Documentation on this page to get the image URLS:
https://www.flickr.com/services/api/misc.urls.html
XXXXXXXX - API Key
Open Test Api - https://api.flickr.com/services/rest/?method=flickr.galleries.getPhotos&api_key=XXXXXXXX&gallery_id=66911286-72157647277042064&format=json&nojsoncallback=1
Model: -
import Foundation
struct ResponseCodable : Codable {
let photos : Photos?
let stat : String?
enum CodingKeys: String, CodingKey {
case photos = "photos"
case stat = "stat"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
photos = try values.decodeIfPresent(Photos.self, forKey: .photos)
stat = try values.decodeIfPresent(String.self, forKey: .stat)
}
}
struct Photos : Codable {
let page : Int?
let pages : Int?
let perpage : Int?
let total : Int?
let photo : [Photo]?
enum CodingKeys: String, CodingKey {
case page = "page"
case pages = "pages"
case perpage = "perpage"
case total = "total"
case photo = "photo"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
page = try values.decodeIfPresent(Int.self, forKey: .page)
pages = try values.decodeIfPresent(Int.self, forKey: .pages)
perpage = try values.decodeIfPresent(Int.self, forKey: .perpage)
total = try values.decodeIfPresent(Int.self, forKey: .total)
photo = try values.decodeIfPresent([Photo].self, forKey: .photo)
}
}
struct Photo : Codable {
let id : String?
let owner : String?
let secret : String?
let server : String?
let farm : Int?
let title : String?
let ispublic : Int?
let isfriend : Int?
let isfamily : Int?
let is_primary : Int?
let has_comment : Int?
enum CodingKeys: String, CodingKey {
case id = "id"
case owner = "owner"
case secret = "secret"
case server = "server"
case farm = "farm"
case title = "title"
case ispublic = "ispublic"
case isfriend = "isfriend"
case isfamily = "isfamily"
case is_primary = "is_primary"
case has_comment = "has_comment"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
id = try values.decodeIfPresent(String.self, forKey: .id)
owner = try values.decodeIfPresent(String.self, forKey: .owner)
secret = try values.decodeIfPresent(String.self, forKey: .secret)
server = try values.decodeIfPresent(String.self, forKey: .server)
farm = try values.decodeIfPresent(Int.self, forKey: .farm)
title = try values.decodeIfPresent(String.self, forKey: .title)
ispublic = try values.decodeIfPresent(Int.self, forKey: .ispublic)
isfriend = try values.decodeIfPresent(Int.self, forKey: .isfriend)
isfamily = try values.decodeIfPresent(Int.self, forKey: .isfamily)
is_primary = try values.decodeIfPresent(Int.self, forKey: .is_primary)
has_comment = try values.decodeIfPresent(Int.self, forKey: .has_comment)
}
}
Request method:-
var photoList = [Photo]()
if let url = URL(string: urlString) {
if let data = try? Data(contentsOf: url) {
// we're OK to parse!
parse(json: data)
}
}
func parse(json: Data) {
let decoder = JSONDecoder()
do{
let jsonPetitions = try decoder.decode(ResponseCodable.self, from: json)
print(jsonPetitions)
let dataInfo = jsonPetitions.photos?.photo
photoList = dataInfo!
}catch{
print(error.localizedDescription)
}
}
Comments
Post a Comment