[6주차] Thread

Seoyoung Lee·2023년 1월 13일
0

UMC

목록 보기
5/8
post-thumbnail

Standard Mission
멀티쓰레드를 활용한 알람시계 개발해보기

구현 화면

  • Date Picker로 시간을 선택한 후 시작 버튼을 누르면 설정한 시간 이후에 알람이 동작한다.
  • 종료 버튼을 누르면 타이머가 작동을 멈춘다.
  • 두 알람은 각각 독립적으로 동작한다.

시작 버튼을 눌렀을 때

		@IBAction func pressFirstStartButton(_ sender: Any) {
        var countDownTime = Int(firstDatePicker.countDownDuration)
        isFirstRunning = true
        DispatchQueue.global().async {
            let runLoop = RunLoop.current
            self.firstTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { [weak self] timer in
                countDownTime -= 1
                DispatchQueue.main.async {
                    let hour = countDownTime / 3600
                    let minute = (countDownTime % 3600) / 60
                    let second = (countDownTime % 3600) % 60
                    self?.firstLabel.text = "\(hour)시간 \(minute)\(second)초 뒤에 알람이 울려요"
                }
                if countDownTime <= 0 {
                    self?.isFirstRunning = false
                    timer.invalidate()
                    DispatchQueue.main.async {
                        self?.firstLabel.text = "알람이 울립니다🚨"
                    }
                    return
                }
            })
            while self.isFirstRunning {
                runLoop.run(until: Date().addingTimeInterval(0.1))
            }
            
        }
    }
  • Dispatch Queue의 Global Queue를 사용해서 두 개의 타이머가 독립적으로 실행될 수 있도록 했다.
  • Global Queue에서 타이머를 실행하기 위해 RunLoop를 사용했다.
  • Main Queue에서 1초마다 UILabel의 텍스트를 바꿔주었다.

종료 버튼을 눌렀을 때

		@IBAction func pressFirstStopButton(_ sender: Any) {
        isFirstRunning = false
        firstTimer.invalidate()
        firstLabel.text = "알람을 울릴 시간을 선택해주세요⏰"
    }
  • Run Loop를 제어하기 위한 변수인 isFirstRunning 변수를 false 로 설정하고 타이머도 invalidate로 설정하였다.
  • UILabel의 텍스트도 처음 설정한 내용으로 다시 바꿔주었다.
profile
나의 내일은 파래 🐳

0개의 댓글