본문 바로가기
카테고리 없음

플러터 공부 Day4: asynchronous programming

by 벡터[x,y] 2023. 4. 5.
반응형

[분류 전체보기] - 플러터 공부 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;

     }

반응형

댓글