Middle
რატომ არ შეიძლება გრძელვადიანი გამოთვლითი ოპერაციების განხორციელება ასინქრონულ მეთოდში?
sobes.tech AI
პასუხი AI-სგან
გრძელვადიანი გამოთვლითი ოპერაციები ასინქრონული მეთოდში, რომელიც შესრულებულია ძირითად იზოლატში (UI თემა), ბლოკავს UI-ს. მიუხედავად იმისა, რომ ასინქრონული მეთოდი იყენებს Future ან async/await, ის მაინც შესრულდება იმავე ნაკადში. როდესაც რესურსმომჭირნე დავალება მიმდინარეობს, UI ვერ განახლდება, რაც იწვევს აპლიკაციის "ყინვას".
გრძელვადიანი ოპერაციების განსახორციელებლად UI-ს ბლოკვის გარეშე უნდა გამოიყენოთ:
- იზოლატები: ცალკე შესრულების ნაკადები, რომლებიც არ იყოფიან მეხსიერებას ძირითადი იზოლატთან. ურთიერთობა იზოლატებს შორის ხდება პორტების (SendPort, ReceivePort) მეშვეობით.
- Compute ფუნქცია: მოსახერხებელი ორბიტა მცირე გამოთვლებისთვის იზოლატების შექმნისა და მართვისთვის.
import 'dart:isolate';
import 'package:flutter/foundation.dart';
// ფუნქცია, რომელიც ასრულებს გრძელვადიან გამოთვლებს
int performHeavyComputation(int data) {
// გრძელვადიანი გამოთვლების იმიტაცია
int result = 0;
for (int i = 0; i < 1000000000; i++) {
result += i;
}
return result + data;
}
// გამოყენება compute-ის, რათა შესრულდეს სხვა იზოლატში
Future<int> heavyComputationInIsolate(int data) async {
return compute(performHeavyComputation, data);
}
// მაგალითი StatefulWidget-ში
class MyWidgetState extends State<MyWidget> {
int computationResult = 0;
Future<void> _startComputation() async {
// გრძელვადიანი გამოთვლების სხვა იზოლატში
computationResult = await heavyComputationInIsolate(10);
setState(() {
// UI განახლება შედეგის მიღების შემდეგ
});
}
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('გამოთვლების შედეგი: $computationResult'),
ElevatedButton(
onPressed: _startComputation,
child: const Text('დაწყება გამოთვლებს'),
),
],
),
);
}
}