[분류 전체보기] - 플러터 공부 Day3: Functional Programming
플러터 공부 Day3: Functional Programming
[분류 전체보기] - 플러터 공부 Day 2: OOP 플러터 공부 Day 2: OOP [분류 전체보기] - 플러터 공부 시작 Day 1 플러터 공부 시작 Day 1 안녕하세요 제가 이번에 시작하는 것은 제가 여러 번 도전했다가 실
jastory.tistory.com
Day 4. 오늘은 asynchronous programming (비동기 프로그래밍) 을 공부했습니다.
Future
-미래에서 받을 값
Future<String> name = Future.value('name'); 과 같이 사용 가능
Future.delayed(Duration(), (){}); -> 첫번째 parameter에 Duration(얼마나 걸릴지)를 넣고 두번째 parameter에 그 후에 작동할 함수를 넣어준다
Future.delayed를 사용하면 기다리는 시간동안 뒤에 있는 작업을 한다
await
- async 를 함수 parameter와 body 사이에 넣어주어야 사용 가능하다
- await를 Future.delay 앞에 사용하면 강제로 코드를 기다리고 나서 뒤에 코드를 실행한다. -> 코드가 순서적으로 실행된다.
- 하지만 기다리는 동안 효율적이게 다른 작업을 또 한다. ex) addNumbers(1,1); addNumbers(2,2); 안에 await Future.delay 가 있다면 addNumbers(1,1); 작업에서 멈추고 addNumbers(2,2); 로 넘어가 작업하고 (1,1);의 Duration이 끝나면 다시 (1,1); 작업을 한다.
- 만약 addNumbers(1,1); 과 addNumbers(2,2); 를 await를 붙여 (1,1)이 완전히 끝나고 (2,2)가 실행되게 하고 싶다면 addNumbers 함수 앞에 Future<void> 를 붙여줘야한다.
Stream
- stream이 닫힐때까지 지속적으로 return 값을 받을 수 있다
- import 'dart:async'; 를 해줘야한다
ex)
final controller = StreamController();
final stream = controller.stream;
// 값을 listen/받는 동안 value를 출력
final listener1 = stream.listen((val){
print('listener1: $val');
});
// 값을 여러번 계속 보내주기
controller.sink.add(1);
controller.sink.add(2);
.
. 이런식으로 계속 listen을 해줄 수 있다 (listen안에 있는 함수는 값을 듣고 있을때 혹은 받고 있을때 실행 된다
- 만약 여러개의 listener를 하고 싶다면 stream = StreamController().stream.asBroadcastStream(); 을 해줘야 한다. 그러면 여러개의 listener로 값을 받을 수 있다.
- for loop 에서 여러번 return(yield)을 해주려면 Future<returntype>을 Stream<returntype> 으로 바꾸고 aysnc* 을 붙여주고 return 대신 yield를 사용한다.
ex)
void main(){
calculate(1).listen((val){
print(val);
});
}
Stream<int> calculate(int number) async* {
for (int i = 0; i < 5; i++){
yield i * number;
}
}
- yield 대신 yield*을 사용하면 모든 stream이 나올때까지 기다리고 다음으로 넘어간다.
ex)
void main(){
playAllStream().listen((val){
print(val);
});
}
Stream<int> playAllStream() async* {
yield* calculate(1);
yield* calculate(2);
}
Stream<int> calculate(int number) async* {
for (int i = 0; i < 5; i++){
yield i * number;
}
}
댓글