Monosnap screencast 2023-07-14 09-18-00.mp4
타이머가 돌아가고 Load 버튼을 누르면 타이머가 멈추지 않고 동시에 데이터를 받아오고 화면에 표시함
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을 다운로드 받고 있기 때문에 멈추는 것
다운로드 받고 텍스트뷰가 업데이트가 된 후에 모든 동작이 끝났으니까 타이머가 진행 되는 것
왜 멈추냐면 지금은 동기로 코딩이 되어있어서 다운로드 받는 작업이 동기화로 진행되는 것
코드를 비동기로 바꿔주면 타이머는 타이머대로, 다운로드는 다운로드대로 동시에 진행시킬 수 있음 .