새소식

iOS/SwiftUI

[SwiftUI] Task and .task in Swift - 3

  • -

[참고 영상]

https://youtu.be/fTtaEYo14jI


[학습 목표]

저번까지 Task의 우선순위와 Task란 무엇인지에 대해서 배워봤다.

하지만 실제로 앱이 실행된다면 유저들의 동작에 따라서 이전에 실행하던 동작이 그만둬야 될 때가 올것이다.

이러한 때를 대비하여 Task의 취소 방법에 대해서 배워보자!


[구현 방법]

우선은 Task의 동작을 그만둬야 할 때가 어떠한 때인지에 대해서 배워보도록 하자.

현재 보고 있는 화면은 Navigation을 통해서 들어갔을 때 이미지가 뜨게 하는 화면이다.

현재 화면에서는 일부러 2초가 늦게 뜨게 하였지만 인터넷 서버의 문제 혹은 네트워크의 문제 등으로 인하여 이미지가 늦게 뜨게 되는 경우는 많을 것이다.

이와 같은 상황에서 유저들은 뒤로 갔다가 다시 오는 경우가 생길 텐데 과연 뒤로 갔을 때 Task가 멈추는 지에 대해서 알아 보자.

 

뒤로가기 버튼을 눌려도 계속해서 실행이 되고 있는 것을 영상에서 Image return success가 뜨는 것을 통해서 알 수가 있다.

 

그럼 이제 Task를 취소 시키는 방법에 대해서 배워보자!

 

@State private var fetchImageTask: Task<(), Never>? = nil
fetchImageTask?.cancel()

해당 두가지 구절을 넣고 돌려보면

이미지가 뜨기 전에 돌아갔을 시 cancelled가 뜨면서 돌아가던 Task가 취소가 되는 것을 확인할 수가 있다.

 

또한

await viewModel.fetchImage()

기존에 동작중인 Task 안에 해당 구절을 넣은 것만으로도 똑같은 결과를 낳을 수가 있다.

 

왜 그런지에 관해서 알아보자.

SwiftUI는 만약 뷰가 동작이 완료되기 전에 사라진다면 자동적으로 자동적으로 Task를 취소한다. 

즉, 우리가 하나하나 귀찮게 Task를 취소할 필요 없이도 SwiftUI에서는 자동적으로 취소가 되는 것이다!

 

+

 

하지만, 해당 구절을 사용해서 취소하게 될 경우에는 Task가 바로 취소가 되지 않는다.

만약 for문 같은 반복문을 사용하고 있었다면 한참 Task가 돌아가게 된다.

이와 같은 경우를 해결하기 위하여 해결방법으로 checkCancellation을 사용하는 방법이 있다.

Task.checkCancellation()

해당 구절을 사용하면 취소가 되었는지 확인을 하면서 바로 취소가 된다.


 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.