포스트

ByteCoin (2)

과제 및 필요한것들을 좀 적다보니 이제서야 시작하게 된다.

API Request 구현하기

지난번에 이어서 시작하겠다.

주소에 값을 입력했을때 결과가 어떻게 나오는지 확인을 하고 끝났었다.

이제 제대로 만들어 보도록 해보자.

1. performRequest 구현하기

해당 기능을 구현하기 앞서 내가 실제로 가져와햘 값들에 대해 Data와 Model을 만들어 주었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct CoinModel { //Model의 변수명은 JSON의 parameter값에서 따왔다.
    
    let base : String // ex) asset_id_base -> base
    let quote : String
    let rate : Double
    
}

struct CoinData : Decodable {
    
    let asset_id_base : String
    let asset_id_quote : String
    let rate : Double
    
}
1
2
3
4
func fetchCoin () {
        let urlString = "\(baseURL)apikey=\(storage.apiKey)"
        performRequest(with: urlString)
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
func performRequest(with urlString : String) {
        if let url = URL(string: urlString) { // 1. URL 생성
            
            let session = URLSession(configuration: .default) // 2. URL Session 생성
            
            let task = session.dataTask(with: url) { data, response, error in // 3. Session에 task 부여
                
                if error != nil { // 에러가 발생하는 경우
                    
                    print(error ?? "Error")
                    
                    return // 리턴을 하여 아무것도 하지 못하게 한다.
                }
                
                if let safeData = data { // 데이터를 정상적으로 받아온다면 옵셔널 바인딩을 해준다.
                        print(safeData)
                    }
                
                }
            }
            
            // 4. task 실시
            task.resume()
 }

일단은 원하는 값을 내가 제대로 가져오는지 확인이 필요했다.

프린트 해보았다.

잘나온다.

일단은 통신이 된다는 뜻이다!

2. parseJSON 구현하기

이젠 이 내용을 Decoding 해서 내가 원하는 값이 나오게 표현해야한다.

JSON을 Decoding 해야하기에 우선 Decodable 프로토콜을 채택하였다. (CoinData)

그리고 JSON을 parsing 하기위해 parseJSON이라는 함수를 만들어 주었다.

파라미터는 내가 만들어둔 CoinData이며, type 은 Data 이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
func parseJSON(_ coinData : Data) -> CoinModel? {
        let decoder = JSONDecoder()
        do {
            let decodedData = try
            decoder.decode(CoinData.self, from: coinData)
            let asset_id_base = decodedData.asset_id_base
            let asset_id_quote = decodedData.asset_id_quote
            let rate = decodedData.rate
            
            let coin = CoinModel(base: asset_id_base, quote: asset_id_quote, rate: rate)
            return coin
            
        } catch {
            
            print(error)
            
            return nil
        }
    }

그리고 실제로 decoding을 실행할 Decoder를 하나 만들어 주고, decoding이 성공했을때, 아닐때를 구분하기 위하여

try-catch 문을 사용 하였다. 그래서 리턴을 CoinModel을 리턴하는데 parsing이 실패 할수도 있기에, 옵셔널로 한다.

다시 돌아가서, 디코딩이 된다면, decodedData로 전달이 되고, CoinModel로 리턴 해야하기에

JSON값과 똑같이 변수를 만들어주고, 담아주었다.

그리고 model를 인스턴스화 하였고 그곳에 각각의 파라미터에 맞는 값을 담아주고, 리턴하게 하였다.

이제 이 함수를 사용해야하기에 다시 performRequest로 돌아간다.

그리고 다음과같은 내용을 추가해준다

1
2
if let coin = self.parseJSON(safeData) {
}

그리고 다시 테스트 해본다

이제는 원하는 값이 출력이 된다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.