浏览代码

Move expensive ops to a separate isolate

Vishnu Mohandas 4 年之前
父节点
当前提交
811a4cb71e
共有 2 个文件被更改,包括 28 次插入11 次删除
  1. 2 10
      lib/services/local_sync_service.dart
  2. 26 1
      lib/utils/file_sync_util.dart

+ 2 - 10
lib/services/local_sync_service.dart

@@ -114,16 +114,8 @@ class LocalSyncService {
         d.inMilliseconds.toString() +
         d.inMilliseconds.toString() +
         "ms");
         "ms");
     final existingIDs = await _db.getExistingLocalFileIDs();
     final existingIDs = await _db.getExistingLocalFileIDs();
-    final List<LocalAsset> unsyncedAssets = [];
-    for (final asset in localAssets) {
-      if (!existingIDs.contains(asset.id)) {
-        unsyncedAssets.add(asset);
-      }
-    }
-    if (unsyncedAssets.isEmpty) {
-      return false;
-    }
-    final unsyncedFiles = await convertToFiles(unsyncedAssets, _computer);
+    final unsyncedFiles =
+        await getUnsyncedFiles(localAssets, existingIDs, _computer);
     await _db.insertMultiple(unsyncedFiles);
     await _db.insertMultiple(unsyncedFiles);
     _logger.info(
     _logger.info(
         "Inserted " + unsyncedFiles.length.toString() + " unsynced files.");
         "Inserted " + unsyncedFiles.length.toString() + " unsynced files.");

+ 26 - 1
lib/utils/file_sync_util.dart

@@ -45,7 +45,32 @@ Future<List<LocalAsset>> getAllLocalAssets() async {
   return assets;
   return assets;
 }
 }
 
 
-Future<List<File>> convertToFiles(
+Future<List<File>> getUnsyncedFiles(
+    List<LocalAsset> assets, Set<String> existingIDs, Computer computer) async {
+  final args = Map<String, dynamic>();
+  args['assets'] = assets;
+  args['existingIDs'] = existingIDs;
+  final unsyncedAssets =
+      await computer.compute(_getUnsyncedAssets, param: args);
+  if (unsyncedAssets.isEmpty) {
+    return [];
+  }
+  return _convertToFiles(unsyncedAssets, computer);
+}
+
+List<LocalAsset> _getUnsyncedAssets(Map<String, dynamic> args) {
+  final List<LocalAsset> assets = args['assets'];
+  final Set<String> existingIDs = args['existingIDs'];
+  final List<LocalAsset> unsyncedAssets = [];
+  for (final asset in assets) {
+    if (!existingIDs.contains(asset.id)) {
+      unsyncedAssets.add(asset);
+    }
+  }
+  return unsyncedAssets;
+}
+
+Future<List<File>> _convertToFiles(
     List<LocalAsset> assets, Computer computer) async {
     List<LocalAsset> assets, Computer computer) async {
   final List<LocalAsset> recents = [];
   final List<LocalAsset> recents = [];
   final List<LocalAssetEntity> entities = [];
   final List<LocalAssetEntity> entities = [];