KakaoTalk_20230714_111437107.jpg

[SUB] 시즌2 모임 종합편 입니다.

RxSwift 4시간만에 끝내기 시즌 2 정리 (~ 38분 30초)

📌우리가 원하는 최종 화면

Monosnap screencast 2023-07-14 09-18-00.mp4

타이머가 돌아가고 Load 버튼을 누르면 타이머가 멈추지 않고 동시에 데이터를 받아오고 화면에 표시함

📌Starter Code

Monosnap screencast 2023-07-14 09-23-21.mp4

season2/step1/RxSwift+MVVM/ViewController.swift

import RxSwift
import SwiftyJSON
import UIKit

//json 불러오는 url 
let MEMBER_LIST_URL = "<https://my.api.mockaroo.com/members_with_avatar.json?key=44ce18f0>"

class ViewController: UIViewController {
    @IBOutlet var timerLabel: UILabel!
    @IBOutlet var editView: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()
        Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { [weak self] _ in
            self?.timerLabel.text = "\\(Date().timeIntervalSince1970)"
        }
    }

		// load버튼 너비가 줄어들면서 옆에 indicator가 생기게 하는 함수
    private func setVisibleWithAnimation(_ v: UIView?, _ s: Bool) {
        guard let v = v else { return }
        UIView.animate(withDuration: 0.3, animations: { [weak v] in
            v?.isHidden = !s
        }, completion: { [weak self] _ in
            self?.view.layoutIfNeeded()
        })
    }

    // MARK: SYNC
		
		//로드버튼 오른쪽에서 돌아가는 indicator
    @IBOutlet var activityIndicator: UIActivityIndicatorView!

		//버튼 누르면 실행되는 코드
    @IBAction func onLoad() {
        editView.text = ""
        setVisibleWithAnimation(activityIndicator, true) 
		
				//다운로드 하는 부분
        let url = URL(string: MEMBER_LIST_URL)!
        let data = try! Data(contentsOf: url)
        let json = String(data: data, encoding: .utf8)
        self.editView.text = json //텍스트뷰에 json 넣기
        
				//indicator 사라지게 하기 
        self.setVisibleWithAnimation(self.activityIndicator, false)
    }
}

문제점

왜그럴까?

서버에 붙어서 json을 다운로드 받고 있기 때문에 멈추는 것

다운로드 받고 텍스트뷰가 업데이트가 된 후에 모든 동작이 끝났으니까 타이머가 진행 되는 것

왜 멈추냐면 지금은 동기로 코딩이 되어있어서 다운로드 받는 작업이 동기화로 진행되는 것

코드를 비동기로 바꿔주면 타이머는 타이머대로, 다운로드는 다운로드대로 동시에 진행시킬 수 있음 .