Dart

스트림 통신하기

꽃피는봄날 2021. 6. 24. 17:19
  • 스트림: - 처음에 넣은 데이터가 꺼낼 때도 가장 먼저 나오는 데이터 구조로 생각할 수 있음
                - 데이터를 차례대로 받아서 처리할 수 있음
                - 서버에서 데이터가 변경될 경우 새로고침하지 않더라도 -> 자동으로 변경된 데이터를 반영할 때 사용

  • async*, yield를 이용해 비동기통신 만듦

  • async* : 스트림 형식을 반환할 때 사용해야함 
                  yield를 이용해 지속적으로 데이터를 전달하겠다는 의미.
  • yield   vs    return  
    - yield : 반환 후에도 계속 함수를 유지
    - return : 한 번 반환하면 함수가 끝남

  • 1. countStream() 함수 호출 (yield를 이용해 지속적으로 데이터를 전달 함, )
    2. yiled로 인해 i 값을 가지고 sumStream을 호출 -> await이므로  print("sumStream -> $value"); 실행 후
        sum에 += 하고 ->
    3.  다시 countStream() 가서 반복 후 for 문이 끝날 경우 -> sumStream() 함수의 return이 실행 되어 ->
        마지막 print(sum)이 실행됨
import 'dart:convert';
import 'dart:core';


Future<int> sumStream(Stream<int> stream1) async{
  var sum = 0;
  await for (var value in stream1){
    print("sumStream -> $value");
    sum += value;
  }
  return sum;
}

Stream<int> countStream(int to) async*{
  for(int i = 1; i <= to; i++){
    print('countStream-> $i');
    yield i;
  }
}

main() async{
  var stream1= countStream(10);
  var sum = await sumStream(stream1);

  print(sum);

}

 

 


import 'dart:convert';
import 'dart:core';


main() async{

  // Stream 클래스 이용해 배열 만들기
  var stream = Stream.fromIterable([1, 2, 3, 4, 5]);

  // 가장 앞의 데이터 결과: 1
  // stream.first.then((value) => print('first 값: $value'));

  // 가장 마지막 데이터의 결과: 5
  // stream.last.then((value) => print("last 값: $value"));


  // 현재 스트림이 비어있는지 확인 : false
  // stream.isEmpty.then((value) => print('isEmpty-> $value'));

  // 전체길이 : 5
  stream.length.then((value) => print('length-> $value'));
  
  
  // !!! 위에 코드를 한꺼번에 다 실행할 경우 -> 오류 발생
  //     why? 스트림을 통해 데이터를 사용하면 데이터는 사라지기 때문임


}