- This topic has 5개 답변, 3명 참여, and was last updated 4 years, 8 months 전에 by JANGHUI.
-
글쓴이글
-
-
JANGHUI참가자
- 글작성 : 2
- 답글작성 : 5
시간 차를 두고 코드를 실행하는 DispatchQueue.main.asyncAfter를 짧게 알아 봤습니다.
https://www.notion.so/c9a9ed47b46d4583aaf3f562726402292020-03-20 오전 9:45 #3138 -
-
-
야곰키 마스터
- 글작성 : 37
- 답글작성 : 579
네, 조금 설명이 부족했습니다.
지금처럼 아이템의 실행 블럭이 짧은 경우에는 너무 순식간이라 블럭 실행과 동시에 종료가 되겠습니다. 그런데 이런 경우도 있어요. 실행 시간이 되어timerExcute
블럭의 실행이 시작되었는데 처리에 시간이 많이 걸리는 블럭이라서 여전히 실행중인 순간에 어떤 코드에서timerExcute
에cancel
메서드를 실행합니다. 그러면cancel
메서드 만으로는 그 블럭의 실행을 중지할 수 없는 것으로 알고 있습니다. 이럴 때는 실질적으로timerExcute
블럭의 실행을 무효화 하려면 어떻게 해야할까요?2020-03-26 오후 10:14 #4590
-
-
-
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가 중지 되었는지를 확인해서 멈추게 하는 방법입니다.
원하시는 답변이 되었는지 잘 모르겠습니다 ㅎㅎ.
혹시 더 좋은 방법이나 방향이 있으시면 말씀해주시면 좀 더 알아보고 싶습니다.
아무나 글을 보시고 좋은게 있으시거나 수정 했으면 좋겠다 하시는건 답변에 남겨 주시면 확인 해보겠습니다.
감사합니다.2020-04-03 오전 12:40 #5993
-
-
글쓴이글
- 답변은 로그인 후 가능합니다.