SharedFlow란?

HEETAE HEO·2022년 9월 21일
0
post-thumbnail

SharedFlow 란?

Sharedlow는 Kotlin의 코루틴 라이브러리 중 하나인 Kotlinx.coroutines에서 제공하는 클래스 입니다. SharedFlow는 다수의 코루틴 간에 데이터를 공유하며, 발행-구독 패턴을 따르는 데이터 스트림을 생성하는데 사용합니다.

SharedFlow는 다수의 수신자가 안전하게 사용할 수 있습니다. 또한 한번에 여러 값을 발행할 수 있는데 이것이 StateFlow와의 대조되는 부분입니다.

SharedFlow는 다른 데이터 스트림과는 달리, 새로운 데이터가 발생할 때마다 구독자들에게 즉시 전달되지 않습니다. 대신 새로운 데이터가 발생하면 버퍼에 저장되어, 구독자들이 나중에 수신할 수 있도록 대기합니다.

SharedFlow의 사용방법

1. SharedFlow 생성하기

먼저 SharedFlow를 생성하려면 다음과 같이 코드를 작성해야합니다.

val sharedFlow = MutableSharedFlow<Int>()

2. 값 전송

SharedFlow를 사용하여 값을 전송하려면 다음과 같이 코드를 작성합니다.

scope.launch {
	sharedFlow.emit(1)
}

3. SharedFlow 구독하기

SharedFlow를 구독하려면 다음과 같이 코드를 작성합니다.

scope.launch {
	sharedFlow.collect { value ->
    	// function
    }
}

4. 버퍼 사용하기

SharedFlow는 버퍼를 사용하여 데이터를 저장할 수 있습니다. 버퍼 크기를 설정하려면 다음과 같이 코드를 작성합니다.

val sharedFlow = MutableSharedFlow<Int>(replay = 0, extraBufferCapacity = 10)

5. reply 사용하기

구독자가 나중에 접속해도 마지막으로 발행된 값으로 받을 수 있는 reply 기능을 사용하려면 다음과 같이 코드를 사용할 수 있습니다.

val sharedFlow = MutableSharedFlow<Int>(replay = 1)

만약 Compose에서 SharedFlow를 사용한다면 다음과 같이 사용할 수 있습니다.

@Composable
fun exampleScreen() {
    val sharedFlow = remember { MutableSharedFlow<String>(replay = 1) }
    var text by remember { mutableStateOf("") }

    // 버튼 클릭 시 SharedFlow에 데이터 발행
    Button(onClick = {
            sharedFlow.emit("버튼 클릭!")
    }) {
        Text("클릭")
    }

    // SharedFlow 구독
    LaunchedEffect(sharedFlow) {
        sharedFlow.asSharedFlow().collect { newString ->
            text = newString
        }
    }

    // 화면에 출력
    Text(text)
}

위 코드에서 MutableSharedFlow의 생성자의 reply라는 것을 설정하는 것을 보실 수 있습니다. 이 부분은 가장 최근에 발행된 데이터 몇개를 저장할 건지 설정할 수 있는 것입니다. 버튼 클릭 시 발행된 문자열이 한 번 놓치더라도, 가장 최근의 데이터가 수신이 됩니다. 만약에 reply 매개변수를 설정하지 않는다면, 새로운 데이터가 발행될 때마다 즉시 수신하게 됩니다.

추가적으로 다른 SharedFlow의 생성자 매개변수에 대해 설명하겠습니다.

extraBufferCapacity : 버퍼의 용량을 늘리기 위한 매개변수입니다. replay 매개변수와 마찬가지로, extraBufferCapacity 매개변수를 사용하면 버퍼에 저장할 데이터의 수를 늘릴 수 있습니다.
onBufferOverflow: 이 매개변수는 SharedFlow에 버퍼가 가득 찼을 때, 새로운 데이터를 추가할 때 발생하는 동작을 정의합니다.

  • BufferOverflow.SUSPEND: 버퍼가 가득 찰 때, emit() 메소드가 호출될 때까지 블로킹됩니다. 따라서, 새로운 데이터가 추가될 때까지, 현재 스레드는 블로킹됩니다.

  • BufferOverflow.DROP_OLDEST: 버퍼가 가득 찰 때, 가장 오래된 데이터를 삭제하고, 새로운 데이터를 추가합니다.

  • BufferOverflow.DROP_LATEST: 버퍼가 가득 찰 때, 가장 최근에 추가된 데이터를 삭제하고, 새로운 데이터를 추가하지 않습니다.

SharedFlow의 가장 큰 장점이 여러 곳에서 동시에 수신할 수 있다는 것인데 이를 코드로 바로 보겠습니다.

val sharedFlow = MutableSharedFlow<String>()
    
// 첫 번째 구독자
sharedFlow.collect { value ->
    println("첫 번째 구독자: $value")
}

// 두 번째 구독자
sharedFlow.collect { value ->
    println("두 번째 구독자: $value")
}

// 새로운 데이터 발행
sharedFlow.emit("새로운 데이터")

위 코드에서는 MutableSharedFlow를 생성한 후, 두 개의 구독자를 추가하고, emit() 메소드를 사용하여 새로운 데이터를 발행합니다. 그리고 구독자에서는 새로운 데이터를 수신하여, 로그를 출력합니다.

profile
Android 개발 잘하고 싶어요!!!

0개의 댓글