UniNuri (10) : 대학교 API 불러오기, UISearchControllor
2023. 7. 9. 16:04
회원가입에서 회원 정보를 입력시키기 위해 대학교 API를 불러올 필요가 있었다.
내가 사용한 API였다.
API : https://github.com/Hipo/university-domains-list
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
'개발일지' 카테고리의 다른 글
TripMate (1) - openweatherAPI와 CLLocationManager 사용하기 (0) | 2023.11.21 |
---|---|
UniNuri (11) : 비밀번호 / 이메일 정규식(Regular Expression) (0) | 2023.07.30 |
UniNuri (9) : Amplify Authentication (0) | 2023.07.02 |
UniNuri (8) : APNs, Authentication Setting (0) | 2023.06.25 |
UniNuri (7) : 댓글 UPDATE / CREATE (0) | 2023.06.24 |