TIL

49일차 TIL

h_luz 2024. 5. 7. 23:46

 

하위뷰로 놓기 

[searchBar,recentView].forEach {
    view.addSubview($0)
}
        
[recentLabel].forEach {
    recentView.addSubview($0)
}

recentLabel을 recentView 하위에 놓고 싶으면 이렇게 addSubview로 호출해 주면 된다!

 

스탠더드반 강의
스파르타 코딩 클럽

 

네트워크 통신

 

1 url 만들기

url : 네트워크 통신을 위해 접근하는 주소

* 단순히 string으로 받을 수 있고, URLComponent를 통해 좀 더 세세하게 정리해서? 받아올 수도 있다 

* 쿼리 (쿼리이름 = 쿼리조건) : 검색 조건 

func fetchNumberAPI(num: Int) {
    guard let url = URL(string: "http://numbersapi.com/\(num)") else { return } // 단순히 !를 통해 강제 해제도 가능
    ...
}

 

2 URLRequest 만들기 + 설정

일반적인 api의 경우 '요청'을 보내야 정보를 받을 수 있다.

    ㄴ '요청'에 대한 설정 가능 ( httpMethod(Get, Post 등등), header, body )

func fetchNumberAPI(num: Int) {
    guard let url = URL(string: "http://numbersapi.com/\(num)") else { return } // 단순히 !를 통해 강제 해제도 가능
    
    var urlRequest = URLRequest(url: url)
    urlRequest.httpMethod = "GET" // 사실 디폴트가 get
    urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type") // api에 따라 json이 디폴트가 아닐수 있음
    ...
}

 

3 URLSession의 Task (error, data, response)

URLSessiont : 네트워크 데이터 전송 Task들 관리 / 네트워크 통신을 위해 사용하는 객체 (shared, default 등등 ,,,,)

 

* Task : 데이터 받아오기(DataTask), 업로드(upload), 다운로드(download) 등 많은 작업 ( .resume()으로 데이터 통신 시작 )

func fetchNumberAPI(num: Int) {
    guard let url = URL(string: "http://numbersapi.com/\(num)") else { return } // 단순히 !를 통해 강제 해제도 가능
    
    var urlRequest = URLRequest(url: url)
    urlRequest.httpMethod = "GET" // 사실 디폴트가 get
    urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type") // api에 따라 json이 디폴트가 아닐수 있음
    
    URLSession.shared.dataTask(with: urlRequest) { data, response, error in
        if let error = error {
            print("에러 발생", error)
        }
        guard let data = data else { return }
        guard let numberInfo = try? JSONDecoder().decode(NumberInfo.self, from: data) else {
            return
        }
        print("결과", numberInfo)
    }
    .resume() // 통신 시작 !
}

 

* 네트워크 통신 사용 시 info 설정

    ㄴ App Transport Security 차단되어 있는 설정을 풀어주지 않으면 http 통신이 불가능

 

* Decodable 프로토콜 채택 : json -> 내 모델

struct NumberInfo : Decodable {
    let text: String
    let number : Int
    ...
}

 

* insomnia 응용프로그램 : 실제 API 요청으로 네트워크 결과를 확인해 볼 수 있음

 

* 퀵타입 (QuickType.io) : 네트워크 통신 결과를 모델로 바꿔주는 사이트

 

* CodingKey : 내가 쓰고 싶은 이름과 API 이름이 다를 때, 바꿔줄 수 있음

struct Eeta: Codable {
    let isEnd : Bool
    let pageableCount, totalCount: Int
    
    enum CodingKeys: String, CodingKey {
        case isEnd = "is_end"
        case pageableCount = "pageable_count"
        case totalCount = "total_count"
    }
}

 

여기서 'isEnd'를 보면 'isEnd'는 내가 쓰고자 하는 이름이고, 'is_end'가 api의 이름이다.

 

*Network Manager : 반복되는 코드를 줄일 수 있음

 


 

개인과제

 

코드베이스에 대해서 익숙해져 가면서,, Lv1인 화면구성을 진행하고 앗다ㅏ..!

색상은 어떻게 레이아웃이 잡히고 있는지 확인하기 위해서 넣어봤다..

그런데 문제는 이렇게 되면,, 컬렉션뷰만 스크롤되고,, 전체 스크롤이 안됨..ㅠㅜ (당연함)

 

그래서.. scrollView를 밑에 깔아봤는데,, 잘 안 되었다.....

그리고 인터넷 찾아보니까 컬렉션뷰를 테이블 뷰에 담는 방식도 있고,,

 

결국 테이블뷰에 컬렉션 뷰를 담는 방식으로 구현해 볼 예정,,

옹 스크롤도 잘 내려감.. 블로그에 다시 정리해서 올려야지..

탭바 만들어놓고 자야지.. ㅠ

'TIL' 카테고리의 다른 글

53일차 TIL  (4) 2024.05.13
52일차 TIL  (2) 2024.05.10
48일차 TIL _codebaseUI  (2) 2024.05.03
46일차 TIL  (0) 2024.05.01
45일차 TIL  (0) 2024.04.30