큰 JSON 디코딩을 Isolate.run으로 메인 isolate 밖에 빼 봤는데, 빨라지기는커녕 보낼 수 없는 객체라는 오류가 났어요. 디코딩 자체는 문제가 없었고 클로저가 문제였어요.
class Loader {
final updates = StreamController<int>();
List<Object?> _decode(String text) => jsonDecode(text) as List<Object?>;
Future<List<Object?>> parse(String text) {
return Isolate.run(() => _decode(text));
}
}
_decode가 인스턴스 메서드라서 클로저가 this를 붙잡고, this는 StreamController를 들고 있어요. 클로저가 닿는 건 전부 새 isolate로 보내지는데 컨트롤러는 보낼 수가 없어요. _decode를 static 메서드로 바꾸니 해결됐어요. 아직 모르겠는 건 실행하기 전에 이걸 알아챌 방법이에요. 위 코드에 분석기는 아무 말도 안 하거든요.