시간 차를 두고 코드를 실행하고 싶을 때.

3 답변 글타래를 보이고 있습니다
  • 글쓴이
    • JANGHUI
      참가자
      • 글작성 : 2
      • 답글작성 : 5

      시간 차를 두고 코드를 실행하는 DispatchQueue.main.asyncAfter를 짧게 알아 봤습니다.
      https://www.notion.so/c9a9ed47b46d4583aaf3f56272640229

    • 도미닉
      참가자
      • 글작성 : 46
      • 답글작성 : 88

      감사합니다

    • 야곰
      키 마스터
      • 글작성 : 37
      • 답글작성 : 580

      cancel()을 호출하더라도 실질적으로 동작을 멈추지는 않는데, 동작하고 있는 작업을 실질적으로 멈추려고 하려면 어떻게 해야할까요?

      • JANGHUI
        참가자
        • 글작성 : 2
        • 답글작성 : 5

        오오 이렇게 답글을 달아 주시다니 감사합니다.
        cancel()을 호출 하더라도 실질적으로 동작을 멈추지 않는다는 부분이 제가 잘 이해가 되지 않는데,
        DispatchQueue.main.asyncAfter의 동작(deadline까지 초를 세는)을 멈추는걸 물어 보신걸까요?

        • 야곰
          키 마스터
          • 글작성 : 37
          • 답글작성 : 580

          네, 조금 설명이 부족했습니다.
          지금처럼 아이템의 실행 블럭이 짧은 경우에는 너무 순식간이라 블럭 실행과 동시에 종료가 되겠습니다. 그런데 이런 경우도 있어요. 실행 시간이 되어 timerExcute 블럭의 실행이 시작되었는데 처리에 시간이 많이 걸리는 블럭이라서 여전히 실행중인 순간에 어떤 코드에서 timerExcutecancel 메서드를 실행합니다. 그러면 cancel 메서드 만으로는 그 블럭의 실행을 중지할 수 없는 것으로 알고 있습니다. 이럴 때는 실질적으로 timerExcute 블럭의 실행을 무효화 하려면 어떻게 해야할까요?

    • JANGHUI
      참가자
      • 글작성 : 2
      • 답글작성 : 5

      질문 주시고 생각을 해봤는데, 블럭 자체의 실행을 무효화 하는 방법은 잘 모르겠습니다.

      지금까지 생각으로는 timerExcute의 실행되는 코드 안에 cancel에 대한 bool값을 가져 올 수 있는 timerExcute?.isCancelled를 적절한 위치에 넣어서 중지 시키는 방법입니다.

      var timerExcute: DispatchWorkItem?
      var cancelExcute: DispatchWorkItem?
      timerExcute = DispatchWorkItem(block: {
          sleep(1)
          for i in 0...10000 {
              if self.timerExcute?.isCancelled ?? false {
                  return
              }
              print("(i)")
          }
      })
      
      cancelExcute = DispatchWorkItem(block: {
          self.timerExcute?.cancel()
          print("--- 취소 ---")
      } )
      
      DispatchQueue.main.asyncAfter(deadline: .now(), execute: timerExcute!)
      DispatchQueue.global().asyncAfter(deadline: .now() + 0.8, execute: cancelExcute!)
      

      이런식으로 특정 타이밍에 timerExcute?.cancel()를 해주면 timerExcute가 실행되고 있다가 중간중간 self.timerExcute?.isCancelled로 timerExcute가 중지 되었는지를 확인해서 멈추게 하는 방법입니다.

      원하시는 답변이 되었는지 잘 모르겠습니다 ㅎㅎ.
      혹시 더 좋은 방법이나 방향이 있으시면 말씀해주시면 좀 더 알아보고 싶습니다.
      아무나 글을 보시고 좋은게 있으시거나 수정 했으면 좋겠다 하시는건 답변에 남겨 주시면 확인 해보겠습니다.
      감사합니다.

      • 이 답변은 JANGHUI에 의해 4 years 전에 수정됐습니다. 이유: Add Markdown Code
      • 이 답변은 JANGHUI에 의해 4 years 전에 수정됐습니다.
      • 이 답변은 JANGHUI에 의해 4 years 전에 수정됐습니다.
      • 이 답변은 JANGHUI에 의해 4 years 전에 수정됐습니다. 이유: 마크다운 어렵다!!
3 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 743-81-02195
통신판매업 신고번호 : 제 2022-충북청주-1278 호
고객센터 : 카카오톡채널 @yagom