what is Coroutine?
먼저 코루틴을 알기전에 먼저
알아야 하는 것이 있다 바로
viewModelScope.launch를 알아야 하는데 여기서 viewmodel 은 무엇일까??
ViewModel은 UI에서 보여줄 데이터를 관리하기 위해 사용한다. ViewModel의 주요 특징 중 하나는 생성-해제 주기가 Activity나 Fragment 같은 컴포넌트의 lifecycle를 따라간다는 점이다. 컴포넌트가 destroy 되기 전까지는 데이터를 쭉 가지고 있다가, destroy 됐을 때 onCleared()를 호출하며 해제된다
ViewModel 내부에서는 viewModelScope 라는 코루틴 스코프를 자동적으로 이용할 수 있기 때문이다.
이는 onCleared()에 자동으로 작업을 취소시켜주는 역할을 한다.
뷰모델의 생명주기에 코루틴 작업을 맞출 수 있다.
이제 코루틴이 무엇인지 한번 알아보자.
말그대로 비동기 코드를 동기 코드로 만들어 주는 것이라고 생각하면 될 것 같다.
동기 vs. 비동기
우선 차이점부터 설명하자면, 동기는 '직렬적'으로 작동하는 방식이고 비동기는 '병렬적'으로 작동하는 방식이다. 즉, 비동기란 특정 코드가 끝날때 까지 코드의 실행을 멈추지 않고 다음 코드를 먼저 실행하는 것을 의미한다. 비동기 처리를 예로 Web API, Ajax, setTimeout 등이 있다.
아래 사진을 통해 차이점을 한눈에 볼 수 있다.
왼쪽 차트는 '비동기'로 작동하는 방식이다. 한번에 여러 태스크가 동시에 병렬적으로 실행된다.
반면, 오른쪽 차트는 '동기'적으로 작동하는 방식이다. 하나의 태스크가 끝날 때 까지 기다렸다가 다음 태스크가 실행된다. 총 실행 시간으로 따지자면 '동기' 방식이 더 느리다.
fun searchImageResult(q: String) = viewModelScope.launch {
kotlin.runCatching {
_isLoading.value = true
val result = getImageUseCase(q)
val imageItems = ArrayList<ImageItemsEntity>()
result.items?.let {
for(i in it.indices){
imageItems.add(it[i])
}
_imageResult.value = imageItems
_isLoading.value = false
}
}.onFailure {
_isLoading.value = false
Log.e("tripmates", it.message.toString())
}
}
이렇게 보면 적 이미지가 추가 되었을때 아래와 같은 코드를 실행해주고
이미지가 없을때는 log를 만들어줘라고 하는 것을 알 수있다.