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? 스트림을 통해 데이터를 사용하면 데이터는 사라지기 때문임
}