[Swift] Timer 실행 순서

김도희·2022년 10월 23일
0


멋사 26일차,, 돌려돌려 돌림판~! 만들기 실습을 내주셨다
여러가지 의견이 나왔는데 우리 2조는 소주병 돌리기 룰렛과 슬롯머신을 만들기로 했고 나는 그 중에 슬롯머신 만들기로~

진짜 슬롯머신처럼 이름이 슉슈슉 보이다가 마지막에 벌칙자 이름이 뙇! 보여주고 싶었다. 무슨 방법이 있을까 생각해보다가 일정 시간동안 일정 시간 간격으로 이름을 보여주면 슉슈슉 보여주는 느낌이 날 것 같아 Timer를 사용해서 만들어 보기로 했다!

.alert("앗! 진짜 돌리신다구요?", isPresented: $start) {
	Button("Cancel", role: .cancel) {}
	Button("OK") {
		var count: Int = 0
		Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true, block: { Timer in
			if timeRemaining > 0 {
				self.timeRemaining -= 1
				count += 1
				if count > (inputTexts.count - 1) {
					count = 0
				}
				name = inputTexts[count]
			} else {
				Timer.invalidate()
			}
		})
		timeRemaining = 30 //Play 버튼을 또 눌렀을 때도 다시 슬롯머신 돌아가도록 타이머 시간 설정
		name = inputTexts.randomElement()! //벌칙자 두둥
		print(name) //벌칙자 이름 확인용
	}
}
  1. OK 버튼 누름
  2. Timer 시작 -> inputTexts에 들어와있는 이름들을 슉슈슉 보여주기
  3. Timer 끝 -> randomElement를 사용: 배열에 있는 이름 중에서 랜덤으로 선택해서 보여주기

이렇게 생각했는데 자꾸 같은 사람 이름만 나오고 확인용으로 찍어놓은 print랑도 이름이 일치하지 않는 것이다!!! 저렇게까지 만들고 정규 수업시간은 끝났고 recap 스터디 때 승태님이 계속 같은 사람만 나오는 거면 버그 아니냐면서 뚝딱뚝딱 고쳐주셨다. 역시 따봉승태님

.alert("앗! 진짜 돌리신다구요?", isPresented: $start) {
	Button("Cancel", role: .cancel) {}
	Button("OK") {
		var count: Int = 0
		Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true, block: { Timer in
			if timeRemaining > 0 {
				self.timeRemaining -= 1
				count += 1
				if count > (inputTexts.count - 1) {
					count = 0
				}
				name = inputTexts[count]
			} else {
				Timer.invalidate()
			}
		})
		timeRemaining = Double.random(in: 30...40)
		// 3의 배수에 위치한 참여자만 걸리는 사쿠라 제거 by 도희 응관 다혜 승태
		print(name) //벌칙자 이름 확인용
	}
}

Timer 돌아가는 시간을 random으로 하니까 벌칙자가 다르게 나오기는 하는데,, 나는 돌아가는 시간이 일정하지 않은 것이 너무 거슬리는 것이다,,,

.alert("앗! 진짜 돌리신다구요?", isPresented: $start) {
	Button("Cancel", role: .cancel) {}
	Button("OK") {
		Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true, block: { Timer in
			if timeRemaining > 0 {
				self.timeRemaining -= 1
				name = inputTexts.randomElement()!
			} else {
				Timer.invalidate()
			}
		})
        timeRemaining = 30
		name = inputTexts.randomElement()!
		print(name) //벌칙자 이름 확인용
	}
}

count가 문젠가 싶어서 count를 없애고 슬롯이 돌아갈 때 이름이 random으로 보이게 해봤는데, 계속 같은 사람이 나오지는 않지만 이름 확인용 print랑 이름이 다르다,,
뭐가 문젠가 싶어서 이것저것 print를 찍어보다가 슬롯이 돌아갈 때 이름이 어떻게 찍히나 확인해보려고 Timer안에 print문을 찍었더니!!!!!

상상치도 못한 순서 ㄴㅇㄱ

당연히 Timer 안쪽 다 실행하고 밑의 코드 실행할거라고 생각했는데, 밑의 코드를 다 실행하고 Timer가 실행됐던 것이다! 그래서 count가 있을 때 4명 넣은 배열에서 index 2인 사람이 계속 나왔나보다,, 종환님이 자꾸 자기만 나오는 것 같다고 했을 때 기분탓이라고 함구시켜버렸는데,, 헤헷~ 죗옹ㅎ

Timer를 만들면 타이머는 0.1초 마다 알아서 돌아가고 있고, 0.1초 뒤에 또 작업을 하기 전에 밑의 코드들이 처리되어서 이런 순서가 된 것이 아닐까 추측해본다! 확실하게 하기 위해서 자료가 있는지 찾아서 추가해야겠다

0개의 댓글