출처 : 유튜브 코드팩토리 비동기 프로그래밍
Future, Await, Returning Future, Stream, Stream 기본기, Broadcast Stream, Stream값 변경하기, Stream 함수, Stream에서의 async 프로그래밍, Yield
동기는 하나의 스레드에서 하나의 로직을 실행하는동안 cpu 사용 불가
서버 요청을했을 때 cpu 사용불가 - cpu 낭비 비효율
비동기 => 서버요청을 했을 때 cpu 사용 가능하도록
## Future - 미래에 받아올 값
Future<String> name = Future.value('가나다'); // 미래에 받아올 스트링 값
Future<int> number = Future.value(1);
@ delayed는 두개의 파라미터 (지연할 기간 Duration, 지연 시간이 지난 후 실행할 함수)
Future.delayed(Duration(seconds:2), (){ print('딜레이 끝');})
void addNumbers(int number1, int number2){
print('계산시작 : $number1 + $number2');
Future.delayed(Duration(seconds:2), (){ print('계산완료 : $numer1 + $number2 = ${number1+number2}')}); // 서버 시뮬레이션
print('함수완료 $numer1+$numer2');
}
void main(){
addNumbers(1,1); // 계산시작 : 1+1 함수 완료 계산완료 순으로 출력됨
}
## Await -비동기여도 cpu 낭비 없이(다른 작업을 한다) 논리적으로 순서대로 출력되도록,
void addNumbers(int number1, int number2) async { // async를 꼭 넣어줘야함
print('계산시작 : $number1 + $number2');
await Future.delayed(Duration(seconds:2), (){ print('계산완료')}); // 서버 시뮬레이션 await는 future를 리턴해주는 함수에만 가능
print('함수완료');
}
void main(){
addNumbers(1,1);
addNumbers(2,2); //출력결과 : 계산시작 : 1+1 계산시작 2+2 계산완료 1+1=2 함수완료: 1+1 계산완료 2+2=4 함수완료 2+2 순으로 출력됨
}
main도 함수여서 await 가능
void main() async {
await addNumbers(1,1);
await addNumbers(2,2);
}
Future<void> addNumbers(int number1, int number2) async{... }
// Future<int> addNumbers(int number1, int number2) async{... return number1+ number2; 그냥 int를 리턴해줘도 future로 감싸줌}
## Stream - 스트림을 닫을 때까지 값을 반복해서 받을 수 있음
Stream을 사용할 수 있는 패키지를 불러와야함
@ import 'dart:async'; - stream controller를 사용할 수 있음
void main(){
final controlloer = StreamController();
// final stream = controller.stream; // 이러면 하나만 들을 수 있는 리스너를 생성하기 때문에
final stream = controller.stream.asBroadcastStream(); // 여러번 리스닝 할 수 있게 함
final streamListener1 = stream.listen((val){
print('Listener 1 : $val');
});
final streamListener2 = stream.listen((val){
print('Listener 2 : $val');
});
controller.sink.add(1); //add함수를 통해서 listener에게 전달
controller.sink.add(2); // 출력 결과 Listener 1: 1 Listener2 : 1 2 2
}
@ 조건을 다르게도 가능
final streamListener1 = stream.where((val)=> val%2 ==0).listen((val){
print('Listener 1 : $val');
}); // 짝수만 듣도록
final streamListener2 = stream.where((val)=> val%2 ==1).listen((val){
print('Listener 2 : $val'); //홀수만 듣도록
});
@ 함수 사용
import 'dart:async';
void main(){
calculate(2).listen((val){ print('calculate : $val');});
calculate(4).listen((val){ print('calculate : $val');}); // 번갈아가면서 출력됨
}
Stream<int> calculate(int number) async* {
for(int i =0; i<5;i++){
yield i*number; // i가 0일 때 return되면서 함수가 끝남 stream으로 하면 반복적으로 가능
} // async*로 하고, return을 yield로 바꿔줌=> 값이 생성될때마다 listener에게 전달
// async*이어도 await 가능
}
## Yield - 두개의 스트림 리스너를 await 하는 방법 - 하나가 다 끝날때까지 기다리는 방법
import 'dart:async';
void main(){
playAllStream().listen((val){ print(val);});
}
Stream<int> playAllStream() async*{
yield* calculate(1); // 모든 값을 다 가져올 때까지 스트림이 끝날 때까지- 일종의 future의 await와 같은 방법
yield* calculate(1000);
}
Stream<int> calculate(int number) async* {
for(int i =0; i<5;i++){
yield i*number;
}
}
'Flutter > Dart' 카테고리의 다른 글
Dart 함수형 프로그래밍 Functional Programming (0) | 2023.07.06 |
---|---|
Dart 객체 지향 프로그래밍 OOP (0) | 2023.07.06 |
Dart 언어 기본기 (0) | 2023.07.05 |
Dart Map - entries, asMap (0) | 2023.02.10 |
Dart List - forEach, map, reduce, fold (0) | 2023.02.10 |