-
[Flutter] 비동기(asynchronous) 처리와 스트림(Stream) 통신코딩/Flutter(플러터) 2021. 11. 4. 10:32
이 글은 저의 복습을 목적으로 작성된 글이며,
Do it! 플러터 앱 프로그래밍 책을 바탕으로 작성되었습니다.
플러터의 언어인 다트(Dart)는 비동기(asynchronous) 처리를 지원한다.
이는 오래 걸리는 작업을 기다리지 않고, 바로 다음 작업을 처리하게 하는 것을 말한다.
일반적으로
1. 네트워크에서 데이터를 가져오는 경우,
2. 데이터베이스 쓰기,
3. 파일 읽기
등의 작업에서 비동기 처리를 이용한다.
데이터를 순서대로 주고받아야 하는데, 네트워크나 와이파이 문제로 특정 API 호출이 늦어져서 순서가 달라지면 원하는 흐름대로 작동하지 않는 경우가 있다. 애플리케이션이 원하는 흐름대로 작동하게 하기 위해, 순서를 보장해야 할 때 스트림(Stream)을 이용한다.
import 'dart:async'; Future<int> sumStream(Stream<int> stream) async { var sum = 0; await for (var value in stream) { 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 stream = countStream(10); var sum = await sumStream(stream); print(sum); } /*실행 결과 countStream : 1 sumStream : 1 countStream : 2 sumStream : 2 countStream : 3 sumStream : 3 countStream : 4 sumStream : 4 countStream : 5 sumStream : 5 countStream : 6 sumStream : 6 countStream : 7 sumStream : 7 countStream : 8 sumStream : 8 countStream : 9 sumStream : 9 countStream : 10 sumStream : 10 55 */
- 함수 이름 뒤 async 키워드를 붙여 해당 함수를 비동기로 만든다.
- await 키워드는 처리를 완료하고 결과를 반환할 때 까지 이후 코드의 처리를 멈춘다.
- async* 명령어는 앞으로 yield를 이용해 지속적으로 데이터를 전달하겠다는 의미이다.
- return은 한번 반환하면 함수가 끝나지만, yield는 반환 후에도 함수를 계속 유지한다.
- 함수 이름 앞에 붙은 Future클래스는 await 작업이 끝난 이후, 그 결과를 받기 위해 붙여준다.
- await가 붙은 함수를 따로 비동기로 처리한 후, 그 결과를 Future클래스에 저장해 놓을 테니, 먼저 나머지 코드를 실행하라는 의미이다.
void main() { checkVersion(); print('end process'); } Future checkVersion() async { var version = await lookUpVersion(); print(version); } int lookUpVersion() { return 12; } /* 실행 결과 end process 12 */
await 키워드는 결과를 반환 할 때 까지 이후의 코드를 멈춘다고 했다.
따라서 main 함수의 나머지 코드가 먼저 실행 된 후,
Future 클래스에 저장해 둔 결과를 이용해서 checkVersion() 함수의 나머지 코드를 실행한다.
비동기 함수가 반환하는 값을 처리하려면 then() 함수를 이용한다.
then() 이외에 error() 함수를 이용할 수 도 있는데,
실행 과정에서 오류가 발생했을 때 호출되므로 예외처리에 사용할 수 있다.
void main() async { await getVersionName().then((value) => { print(value) }); print('end process'); } Future<String> getVersionName() async { var versionName = await lookUpVersionName(); return versionName; } String lookUpVersionName() { return 'Android Q'; } /*실행결과 Android Q end process */
'코딩 > Flutter(플러터)' 카테고리의 다른 글
[Flutter] 플러터 프로젝트의 구성 (0) 2021.11.04