새소식

개발일지

UniNuri (10) : 대학교 API 불러오기, UISearchControllor

  • -

회원가입에서 회원 정보를 입력시키기 위해 대학교 API를 불러올 필요가 있었다.

내가 사용한 API였다.

 

API : https://github.com/Hipo/university-domains-list

 

GitHub - Hipo/university-domains-list: University Domains and Names Data List & API

University Domains and Names Data List & API. Contribute to Hipo/university-domains-list development by creating an account on GitHub.

github.com

 

Alamofire로 불러와 JSON으로 파싱 하고 싶었다. 하지만 struct를 만드는 부분이 굉장히 나에게 어려웠다.

아래는 데이터를 호출했을 때 JSON 파일이다.

 

- JSON

{
        "web_pages": [
            "http://www.ajou.ac.kr/"
        ],
        "domains": [
            "ajou.ac.kr"
        ],
        "country": "Korea, Republic of",
        "name": "Ajou University",
        "state-province": null,
        "alpha_two_code": "KR"
}

 

 

 

- struct(in Swift)

struct Univ: Codable{
    let webPage: [String]
    let domains: [String]
    let country: String
    let name: String
    let state: String?
    let code: String
    
    enum CodingKeys: String, CodingKey {
        case webPage = "web_pages"
        case domains
        case country
        case name
        case state = "state-province"
        case code = "alpha_two_code"
    
    }
}

web_page와 domain은 [String]으로 state-province는 String?, 나머지는 String형으로 struct를 만들었다.

struct를 만들 때에 CodingKeys 부분을 추가하면 오류가 발생하였는데, 이건 도대체 이유를 모르겠지만 됐다..

 

 

Alamofire을 사용하여 API를 호출하였다.

import Alamofire

func fetchUnivList(completionHandler: @escaping(Result<[Univ], Error>) -> Void){
    let url = "http://universities.hipolabs.com/search"
    let param = ["country" : country]

    AF.request(url, method: .get, parameters: param, encoding: URLEncoding.default, headers: ["Content-Type" : "application/json", "Accept" : "application/json"])
        .responseData(completionHandler: {
            response in

            switch response.result{
            case let .success(data):
                do{
                    let decoder = JSONDecoder()
                    let result = try decoder.decode([Univ].self, from: data)
                    completionHandler(.success(result))
                }
                catch{
                    completionHandler(.failure(error))
                }
            case let .failure(error):
                completionHandler(.failure(error))
            }
        })
}

 

Alamofire은 URLSession을 일일이 선언하여 사용하는 것을 보다 편하게 하기 위한 Framework이다.

참고:  

 

JSON Decoder 사용 시 [Univ] 형태로 받아야 Parsing이 가능했다.

 

 


API를 TableView로 불러왔다. 하지만 많은 대학교를 일일이 찾아서 선택할 수는 없다.

그래서 UISearchController를 사용했다.

 

1. tableView와 searchController를 선언했다.

@IBOutlet weak var listTableView: UITableView!

let searchController = UISearchController(searchResultsController: nil)

 

2. SearchContorller 구성 함수를 만든다.

private func setUpSearchController(){

    listTableView.tableHeaderView = searchController.searchBar
    searchController.searchBar.placeholder = "University Name"
    searchController.searchResultsUpdater = self
    searchController.obscuresBackgroundDuringPresentation = false
    searchController.searchBar.searchBarStyle = UISearchBar.Style.prominent
    searchController.searchBar.sizeToFit()
}

 

3. UISearchResultsUpdating

extension UnivListViewController: UISearchResultsUpdating{
    func filterContentForSearchText(_ searchText: String){
        filterUniv = allUniv.filter({(univ) -> Bool in
            return univ.name.lowercased().contains(searchText.lowercased())
        })
        
        listTableView.reloadData()
    }
    
    func updateSearchResults(for searchController: UISearchController) {
        filterContentForSearchText(searchController.searchBar.text ?? "")
    }
}

결과

 

 

 

 


 

참고

https://velog.io/@gnwjd309/iOS-Alamofire
https://fomaios.tistory.com/entry/iOS-%EA%B2%80%EC%83%89%ED%95%98%EA%B3%A0-%EA%B2%80%EC%83%89%ED%95%9C-%EA%B8%80%EC%9E%90-%ED%95%84%ED%84%B0%EB%A7%81%ED%95%9C-%EA%B0%9D%EC%B2%B4-%ED%85%8C%EC%9D%B4%EB%B8%94%EB%B7%B0%EC%97%90-%EB%9D%84%EC%9A%B0%EA%B8%B0Search-Object-Filtering

 

728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.