Skip to main content

Custom Loader (Activity Indicator) in Swift

Creating a custom activity indicator in Swift allows you to tailor the appearance and behavior of your loading spinner to fit the style of your app. Here's a step-by-step guide to creating a simple custom activity indicator using UIView Step 1: Create a New Swift File for the Custom Activity Indicator Create a new Swift file and name it  RotatingCirclesView.swift . Add the following code to define a custom UIView subclass for your activity indicator: // //   RotatingCirclesView.swift //   Welcome In // //   Created by Praveen Kumar on 05/09/24. // import UIKit class RotatingCirclesView : UIView {          let circle1 = UIView ( frame : CGRect ( x : 20 , y : 20 , width : 60 , height : 60 ))     let circle2 = UIView ( frame : CGRect ( x : 120 , y : 20 , width : 60 , height : 60 ))          let position : [ CGRect ] = [ CGRect ( x : 30 , y : 20 , width : 60 , height : 60 ), CGRect ( x : 60 , y : 15 , width : 70 , height : 70 ), CGRect ( x : 110 , y : 20 , width : 60 , heigh

JSON Parsing with Codable in Swift - Nested JSON Model

#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