Stream์ด๋?
๐ฌ ์คํธ๋ฆผ์ ๋ฐ์ดํฐ๋ ์ด๋ฒคํธ๊ฐ ๋ค์ด์ค๋ ํต๋ก๋ค.
๐ฌ ์ฑ์ ๋ง๋ค๋ค๋ณด๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ผ์ด ๋ง์๋ฐ, ์ด๋ ํ์ด๋ฐ์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ฌ ์ง ์๊ธฐ ์ด๋ ค์ด ๊ฒ์ ๋น๋๊ธฐ ์์ ์ผ๋ก ์ฒ๋ฆฌํ ๋ ์คํธ๋ฆผ์ด ์ฌ์ฉ๋๋ค.
๐ฌ ๊ฐ๋จํ ์๋ฅผ ํตํด ์คํธ๋ฆผ์ ์ดํดํด๋ณด์.
import 'dart:async';
void main() {
// 1์ด๋ง๋ค ๋ฐ์ดํฐ 1๊ฐ๋ฅผ ์ต๋ 5๊ฐ๊น์ง ๋ง๋ฆ
Stream stream = Stream.periodic(Duration(seconds: 1), (x) => x).take(5);
// ์ด๋ฒคํธ ์ฒ๋ฆฌ
stream.listen(print);
}
โฝ ์คํธ๋ฆผ์ ํ์ชฝ ๋์์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ณ ๋ค๋ฅธ ์ชฝ์์๋ ๋ณด๋ธ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ ์๋ ํ์ดํ์ ๊ฐ๋ค.
โฝ ์คํธ๋ฆผ์ ๊ธฐ๋ณธ์ ์ผ๋ก Single Subscription, ์ฆ ํ๋์ ์คํธ๋ฆผ์๋ ํ๋์ ๋ฆฌ์ค๋๋ง ๋ฑ๋ก์ด ๊ฐ๋ฅํ๋ค.
Stream ๊ฐ ๋ณ๊ฒฝํ๊ธฐ
import 'dart:async';
void main() {
Stream stream = Stream.periodic(Duration(milliseconds: 200), (x) => x)
.take(3)
.map((x) => x + 10);
stream.listen(print);
}
/*
10
11
12
*/
โฝ ๊ฐ๋จํ ์ฒ๋ฆฌ๋ map์ ํตํด ๊ฐ๋ฅํ์ง๋ง, ๋ณต์กํ ์ฒ๋ฆฌ๋ StreamTransformer๋ฅผ ํตํด ๊ฐ๋ฅํ๋ค.
import 'dart:async';
void main() {
StreamTransformer transform = new StreamTransformer.fromHandlers(
handleData : (data, sink) {
sink.add('first $data');
sink.add('second $data');
},
);
Stream stream = new Stream.fromIterable(<dynamic>['hello', 1, 2]);
stream.transform(transform).listen((event) => print('listen: $event'));
}
/*
listen: first hello
listen: second hello
listen: first 1
listen: second 1
listen: first 2
listen: second 2
*/
์ฌ์ฉ์ ์ ์ ์คํธ๋ฆผ
import 'dart:async';
// async* ํค์๋๋ yield ํค์๋๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค๋ ๋ป์ด๋ค.
Stream<int> createStream(List<int> numbers) async* {
for (int element in numbers) {
yield element;
}
}
void main() {
Stream<int> stream = crateStream(<int>[1, 2, 3, 4, 5]);
stream.listen(print);
}
/*
1
2
3
4
5
*/
โฝ async*๋ generator๋ฅผ ๋ง๋ ๋ค๋ ๋ป์ด๋ฉฐ, ์ด๋ ์์ฒญ์ด ์์ ๋๊น์ง ์ฐ์ฐ์ ๋ฏธ๋ฃจ๋ค๊ฐ ํ์ํ ๋ ์ฒ๋ฆฌํ๋ค๋ ๋ป์ด๋ค.
โฝ yeild๋ ํ ๋ฒ ๋ฐํํ๋ฉด ํจ์๊ฐ ์ข ๋ฃ๋๋ return๊ณผ ๋ค๋ฅด๊ฒ, ์ด๋ฆฐ ์ฑ๋ก ์กด์ฌํ์ฌ ํ์ํ ๋ ๋ค๋ฅธ ์ฐ์ฐ์ ํ ์ ์๋ค.
StreamSubscription์ด๋?
๐ฌ ์์ ์์ ์์๋ listen()์์ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ํ ๊ฒ ๊ฐ์์ผ๋, ์ค์ ๋ก๋ StreamSubscription์์ ์ด๋ฒคํธ ์ฝ๋ฐฑ์ ๋ค๋ฃฌ๋ค.
๐ฌ listen ์ฝ๋ฐฑ ํจ์๋ StreamSubscription์ ๋ฐํํ๋ฉฐ, StreamSubscription์ ์ฑ์ด ์ข ๋ฃ๋๊ธฐ ์ ๊น์ง ํญ์ ์ด๋ ค ์์ผ๋ฏ๋ก, ๋ฉ๋ชจ๋ฆฌ ๋์ ์ํ์ด ์์ด ๋ซ์์ค์ผ ํ๋ค.
๐ฌ ๋ํ, onData, onError, onDone์ ํตํด ์ด๋ฒคํธ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค.
import 'dart:async';
void main() {
Stream<int> stream =
new Stream.periodic(new Duration(milliseconds: 200), (x) => x).take(5);
StreamSubscription subscription = stream.listen(
(data) => print('data: $data'), // ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ์ฒ๋ฆฌ
onDone: () { // ๋ ์ด์ ๋ฐ์ดํฐ๊ฐ ์์ ๋
print('Stream Completed');
},
onError: (err) { // ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋
print('Error : $err');
},
);
}
void dispose() {
subscription.cancel();
super.dispose();
}
/*
data: 0
data: 1
data: 2
data: 3
data: 4
Stream Completed
*/
StreamController๋?
๐ฌ StreamController๋ ์ฌ๋ฌ ๊ฐ์ ์คํธ๋ฆผ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ง๋ค์ด์ก๋ค.
๐ฌ StreamController๋ฅผ ํตํด์ ๊ฐ์ ๋ฃ์ ์ ์๋ ์คํธ๋ฆผ์ ๋ง๋ค ์ ์๊ณ , ์ด๋ stream ์์ฑ์ ํตํด ์ ๊ทผํ ์ ์๋ค.
Broadcast
๐ฌ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ง๋ค์ด์ง๋ ์คํธ๋ฆผ์ ํ ๊ณณ์์๋ง listen ํ ์ ์๋ค. ๋ฐ๋ผ์ ํ๋์ stream์ listen์ ๋ ๊ฐ ์ด์ ์ฐ๊ฒฐ์ํค๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
๐ฌ ํ์ง๋ง, broadcast๋ฅผ ํตํด์ ํ๋์ stream์ ์ฌ๋ฌ ๊ฐ์ listen์ ํ ๋นํ ์ ์๋ค.
import 'dart:async';
void main() {
StreamController<int> controller = new StreamController.broadcast();
Stream<int> stream = controller.stream; // Stream ์ ๊ทผ
stream.listen((event) => print('broadcast 1 : $event')); // Stream ์ฌ์ฉ
stream.listen((event) => print('broadcast 2 : $event')); // Stream ์ฌ์ฉ
controller.sink.add(10); // Stream์ ๊ฐ ์ถ๊ฐ
controller.sink.add(20); // Stream์ ๊ฐ ์ถ๊ฐ
controller.close(); // Stream ์ข
๋ฃ
}
/*
broadcast 1 : 10
broadcast 2 : 10
broadcast 1 : 20
broadcast 2 : 20
*/
'Flutter > Concept' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ Flutter ] ๋ฆฌ์คํธ (0) | 2022.02.27 |
---|---|
[ Flutter ] ํ๋ฉด ํ์ (0) | 2022.02.27 |
[ Flutter ] ํ ์คํธ (0) | 2022.02.27 |
[ Flutter ] ํ๋ซํผ ๋์ (0) | 2022.02.24 |
[ Flutter ] ์ด๋ฏธ์ง (0) | 2022.02.22 |