포스트

ByteCoin (4)

protocol 만들기

1
2
3
protocol CoinProtocol {
    func didUpdateCoin(coinManager : CoinManager, coin : CoinModel)
}

다음과 같이 프로토콜을 만들어 주었다.

그리고 강의에서 했던 그대로 delegate를 만들어 주었다.

첨에 무의식적으로 :이 아닌 =으로 해서 자꾸 이상하게 되었다…

머리가 굳었나보다.

다시 돌아가서

performRequest에

1
2
3
4
if let coin = self.parseJSON(safeData) { // 클로저 안이라 self를 명시
                                                                  // safeData를 parseJSON을통해 파싱 해준 값을 저장
                        self.delegate?.didUpdateCoin(coinManager: self, coin: coin)
                    }

delegate를 통해 전달하게 하였다.

그리고 CoinViewController에 CoinProtocol 따르게 하였고

일부러 이렇게해서 실행했다.

역시 안된다

생각해보니 프로토콜을 사용하면 이걸 써줘야했는데 까먹었다.

coinManager.delegate = self

바로 viewDidLoad쪽해 해당 내용을 적어주었다.

DispatchQueue 사용하기

1
2
3
4
5
6
func didUpdateCoin(coinManager: CoinManager, coin: CoinModel) {
        DispatchQueue.main.async {
            self.bitCoinLabel.text = coin.stringRate
        }
        
    }

이렇게 dispatchqueue를 통해 전달하게 하였다.

그리고 실행한다.

잘되긴 한다.

하지만 왜 프로토콜을 통해서 전달을 해야할까?

뭔가 궁금해지기 시작한다.

이부분을 주말에 좀 더 해봐야하지 않을까 싶다.

프로토콜을 통해 전달을 할때는 보통 데이터를 보내는쪽에 프로토콜을 선언하고,

받는쪽에서 해당 프로토콜을 채택해서 사용하는듯 하다.

좀 더 찾아봐야겠다.

extension으로 나누기.

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
26
27
28
29
30
31
extension CoinViewController : CoinProtocol {
    func didUpdateCoin(coinManager: CoinManager, coin: CoinModel) {
        DispatchQueue.main.async {
            self.bitCoinLabel.text = coin.stringRate
        }
        
    }
}

extension CoinViewController : UIPickerViewDataSource, UIPickerViewDelegate {
    
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return coinManager.currencyArray.count
    }
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return coinManager.currencyArray[row]
    }
    
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        let selectedCurrency = coinManager.currencyArray[row]
        coinManager.getCoinPrice(for: selectedCurrency)
        
    }
}


생각해보니 currency가 계속 USD로 고정이 되어있어서 그부분 수정을 해주었다.

1
2
3
4
5
6
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        let selectedCurrency = coinManager.currencyArray[row]
        coinManager.getCoinPrice(for: selectedCurrency)
        currencyLabel.text = selectedCurrency // new
    }

이젠 정확하게 잘된다.


복기

강의도 영어지만 발번역이라 내가 영어 자막으로해서 이해를 하고 수업을 듣다보니 생각보다 오래걸렸다.

그리고 더군다나 자막 싱크가 맞지않는것도 컸다 (한글일때)

그래서 어쩔땐 그냥 영어로 해놓고 보는게 더 편할때가 많았다.

네트워크로 가져오는것에 대해 확실히 처음하다보니 그부분에 있어 코드를 작성할때, 뼈대는 아무래도 좀 이전 코드를 참고해서 사용하는게 많았다.

보완해야할 점

  1. perform Request 부분 구현하기.
    • 코드를 작성하면서 확실히 뭐랄까 Flow는 이해가 되었다.
    • ⭐️ 다만 Escaping Closure 를 사용해서 리턴을 할수 있다고 튜터님이 하시는데, 아직 리턴을 내가 해보진 못했다.
      • Escaping Closure에 대한 자료를 더 찾아봐야겠다. 영어가 되었든 일본어가 되었든 (근데 영어가 더 편하긴하다.)
  2. 각 file(편의상 파일이라고 하겠다.) 간 데이터 통신문제.
    • 처음에는 프로토콜을 사용하지 않고 데이터 전달을 하고 싶었다.
    • 그래서 viewcontroller를 인스턴스화 해서 값을 전달하려고 하였다.
      • 그게 안되어서 튜터님께 여쭤본결과, 그렇게하면 값이 전달이 안될거에요 라고 하시고, escaping closure를 사용해보라고 하셨다.
        • 즉 1번의 내용과 비슷.
    • 인스턴스화를 하는 위치의 문제
      • struct안에 하다보니… 실행이 잘되던게 갑자기 실행이 안된다.
        • 메모리 누수를 의심해보았다.
        • 실제로 인스턴스를 무한히 생성하고있었다.
    • 프로토콜을 사용했고 데이터 전달을 했다.
      • 너무 잘된다…
        • 데이터 통신에 대한 내스스로의 분석이 필요할거같아 주말에 Deep-Dive형식으로 글을 한번 작성해보려 한다.
  3. 프로토콜 채택시 viewDidLoad에 추가하지 않았다.
    • 분명히 공부할때도 사람들이 자주 깜빡하는게 저것이라고 했고, 나도 그렇게 정리하며 적었는데, 역시 나도 그 부류였다.
    • 바로 문제점을 캐치하고 delegate.self 를 사용해 해결하였다.

일단 큰틀에서는 이렇게 3개 같다.

아무래도 네트워킹을 처음해보다보니 조금은 빡셌지만, 확실히 수업을 정리할땐 이게 맞나 싶으면서 정리한게 많았는데,

실제로 내가 막힐때 내가 쓴글을 보며 참고하는데, 아 이게 이거구나 하면서 이해한게 많았다.

뭐든 해봐야한다.

그럼 이건 여기까지.

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