Skip to main content

now data is live, but slow

ID
7859ac3
date
2023-06-15 07:46:59+00:00
author
Alex Chan <alex@alexwlchan.net>
parent
705bb3a
message
now data is live, but slow
changed files
4 files, 90 additions, 26 deletions

Changed files

BlinkReviewer/Blink.xcodeproj/project.pbxproj (34154) → BlinkReviewer/Blink.xcodeproj/project.pbxproj (34154)

diff --git a/BlinkReviewer/Blink.xcodeproj/project.pbxproj b/BlinkReviewer/Blink.xcodeproj/project.pbxproj
index 9c9fb4d..30bff5c 100644
--- a/BlinkReviewer/Blink.xcodeproj/project.pbxproj
+++ b/BlinkReviewer/Blink.xcodeproj/project.pbxproj
@@ -588,7 +588,7 @@
 				CODE_SIGN_ENTITLEMENTS = Blink/Blink.entitlements;
 				CODE_SIGN_STYLE = Automatic;
 				COMBINE_HIDPI_IMAGES = YES;
-				CURRENT_PROJECT_VERSION = 15;
+				CURRENT_PROJECT_VERSION = 18;
 				DEVELOPMENT_ASSET_PATHS = "\"Blink/Preview Content\"";
 				ENABLE_PREVIEWS = YES;
 				GENERATE_INFOPLIST_FILE = YES;
@@ -615,7 +615,7 @@
 				CODE_SIGN_ENTITLEMENTS = Blink/Blink.entitlements;
 				CODE_SIGN_STYLE = Automatic;
 				COMBINE_HIDPI_IMAGES = YES;
-				CURRENT_PROJECT_VERSION = 15;
+				CURRENT_PROJECT_VERSION = 18;
 				DEVELOPMENT_ASSET_PATHS = "\"Blink/Preview Content\"";
 				ENABLE_PREVIEWS = YES;
 				GENERATE_INFOPLIST_FILE = YES;
@@ -640,7 +640,7 @@
 				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 15;
+				CURRENT_PROJECT_VERSION = 18;
 				GENERATE_INFOPLIST_FILE = YES;
 				MACOSX_DEPLOYMENT_TARGET = 13.3;
 				MARKETING_VERSION = 1.0;
@@ -658,7 +658,7 @@
 				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 15;
+				CURRENT_PROJECT_VERSION = 18;
 				GENERATE_INFOPLIST_FILE = YES;
 				MACOSX_DEPLOYMENT_TARGET = 13.3;
 				MARKETING_VERSION = 1.0;
@@ -675,7 +675,7 @@
 			buildSettings = {
 				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 15;
+				CURRENT_PROJECT_VERSION = 18;
 				GENERATE_INFOPLIST_FILE = YES;
 				MARKETING_VERSION = 1.0;
 				PRODUCT_BUNDLE_IDENTIFIER = net.alexwlchan.BlinkReviewerUITests;
@@ -691,7 +691,7 @@
 			buildSettings = {
 				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 15;
+				CURRENT_PROJECT_VERSION = 18;
 				GENERATE_INFOPLIST_FILE = YES;
 				MARKETING_VERSION = 1.0;
 				PRODUCT_BUNDLE_IDENTIFIER = net.alexwlchan.BlinkReviewerUITests;

BlinkReviewer/Blink/Photos/PhotosLibrary.swift (9401) → BlinkReviewer/Blink/Photos/PhotosLibrary.swift (11438)

diff --git a/BlinkReviewer/Blink/Photos/PhotosLibrary.swift b/BlinkReviewer/Blink/Photos/PhotosLibrary.swift
index 10b0f9c..4402eb4 100644
--- a/BlinkReviewer/Blink/Photos/PhotosLibrary.swift
+++ b/BlinkReviewer/Blink/Photos/PhotosLibrary.swift
@@ -13,9 +13,15 @@ class PhotosLibrary: NSObject, ObservableObject, PHPhotoLibraryChangeObserver {
     @Published var assets: PHFetchResult<PHAsset> = PHFetchResult()
     @Published var assetIdentifiers: [String] = []
     
-    @Published var approvedAssets: PHFetchResult<PHAsset> = PHFetchResult()
-    @Published var rejectedAssets: PHFetchResult<PHAsset> = PHFetchResult()
-    @Published var needsActionAssets: PHFetchResult<PHAsset> = PHFetchResult()
+    var approvedAssets: PHFetchResult<PHAsset> = PHFetchResult()
+    var rejectedAssets: PHFetchResult<PHAsset> = PHFetchResult()
+    var needsActionAssets: PHFetchResult<PHAsset> = PHFetchResult()
+    
+    private var approvedAssetIdentifiers: Set<String> = Set()
+    private var rejectedAssetIdentifiers: Set<String> = Set()
+    private var needsActionAssetIdentifiers: Set<String> = Set()
+    
+    private var favoriteAssetIdentifiers: Set<String> = Set()
     
     // We publish the latest changes we detect from the Photos library.
     //
@@ -86,6 +92,8 @@ class PhotosLibrary: NSObject, ObservableObject, PHPhotoLibraryChangeObserver {
                 self.needsActionAssets = needsActionChangeDetails.fetchResultAfterChanges
             }
             
+            self.regenerateAssetIdentifiers()
+            
             printElapsed("get all photos data (update)")
             
             self.isPhotoLibraryAuthorized = PHPhotoLibrary.authorizationStatus() == .authorized
@@ -115,11 +123,12 @@ class PhotosLibrary: NSObject, ObservableObject, PHPhotoLibraryChangeObserver {
             
             if (self.isPhotoLibraryAuthorized) {
                 self.assets = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: options)
-                self.regenerateAssetIdentifiers()
 
                 self.approvedAssets = PHAsset.fetchAssets(in: self.approved, options: nil)
                 self.rejectedAssets = PHAsset.fetchAssets(in: self.rejected, options: nil)
                 self.needsActionAssets = PHAsset.fetchAssets(in: self.needsAction, options: nil)
+                
+                self.regenerateAssetIdentifiers()
             }
             
             printElapsed("get all photos data (new)")
@@ -166,6 +175,26 @@ class PhotosLibrary: NSObject, ObservableObject, PHPhotoLibraryChangeObserver {
         state(of: asset(at: index))
     }
     
+    func state(ofLocalIdentifier localIdentifier: String) -> ReviewState? {
+        if self.rejectedAssetIdentifiers.contains(localIdentifier) {
+            return .Rejected
+        }
+        
+        if self.needsActionAssetIdentifiers.contains(localIdentifier) {
+            return .NeedsAction
+        }
+        
+        if self.approvedAssetIdentifiers.contains(localIdentifier) {
+            return .Approved
+        }
+        
+        return nil
+    }
+    
+    func isFavorite(localIdentifier: String) -> Bool {
+        self.favoriteAssetIdentifiers.contains(localIdentifier)
+    }
+    
     // Implements a basic cache for thumbnail images.
     //
     // Thumbnail images are small and easily reused; I've put them here because
@@ -227,12 +256,39 @@ class PhotosLibrary: NSObject, ObservableObject, PHPhotoLibraryChangeObserver {
     }
     
     private func regenerateAssetIdentifiers() -> Void {
-        var result: [String] = []
+        var assetIdentifiers: [String] = []
+        var favoriteAssetIdentifiers: Set<String> = Set()
         
         self.assets.enumerateObjects { asset, _, _ in
-            result.append(asset.localIdentifier)
+            assetIdentifiers.append(asset.localIdentifier)
+            
+            if asset.isFavorite {
+                favoriteAssetIdentifiers.insert(asset.localIdentifier)
+            }
+        }
+        
+        var approvedAssetIdentifiers: Set<String> = Set()
+        
+        self.approvedAssets.enumerateObjects { asset, _, _ in
+            approvedAssetIdentifiers.insert(asset.localIdentifier)
+        }
+        
+        var rejectedAssetIdentifiers: Set<String> = Set()
+        
+        self.rejectedAssets.enumerateObjects { asset, _, _ in
+            rejectedAssetIdentifiers.insert(asset.localIdentifier)
+        }
+        
+        var needsActionAssetIdentifiers: Set<String> = Set()
+        
+        self.needsActionAssets.enumerateObjects { asset, _, _ in
+            needsActionAssetIdentifiers.insert(asset.localIdentifier)
         }
         
-        self.assetIdentifiers = result
+        self.assetIdentifiers = assetIdentifiers
+        self.favoriteAssetIdentifiers = favoriteAssetIdentifiers
+        self.approvedAssetIdentifiers = approvedAssetIdentifiers
+        self.rejectedAssetIdentifiers = rejectedAssetIdentifiers
+        self.needsActionAssetIdentifiers = needsActionAssetIdentifiers
     }
 }

BlinkReviewer/Blink/Views/Thumbnails/ThumbnailImage.swift (2575) → BlinkReviewer/Blink/Views/Thumbnails/ThumbnailImage.swift (2550)

diff --git a/BlinkReviewer/Blink/Views/Thumbnails/ThumbnailImage.swift b/BlinkReviewer/Blink/Views/Thumbnails/ThumbnailImage.swift
index 29d51a9..e4d8708 100644
--- a/BlinkReviewer/Blink/Views/Thumbnails/ThumbnailImage.swift
+++ b/BlinkReviewer/Blink/Views/Thumbnails/ThumbnailImage.swift
@@ -21,8 +21,6 @@ struct ThumbnailImageInner: View {
 /// small previews, not complete images.
 struct ThumbnailImage: View {
     
-    @EnvironmentObject var photosLibrary: PhotosLibrary
-    
     // Implementation note: the reason we pass in a bunch of individual
     // properties rather than the whole asset is because we need an
     // @EnvironmentObject (the PhotosLibrary) to create the PHAssetImage,
@@ -34,14 +32,21 @@ struct ThumbnailImage: View {
     @State var assetImage: PHAssetImage? = nil
     
     var index: Int
-    @State var state: ReviewState? = nil
+    var state: ReviewState?
     var isFocused: Bool
-    @State var isFavorite: Bool = false
+    var isFavorite: Bool
+    private var getAssetImage: () -> PHAssetImage
     
-    init(index: Int, isFocused: Bool) {
-        print("creating thumbnail image")
+    // need to pass in state hre also + favorites
+    init(index: Int, state: ReviewState?, isFavorite: Bool, isFocused: Bool, getAssetImage: @escaping () -> PHAssetImage) {
+//        print("creating thumbnail image")
         self.index = index
+        
+        self.isFavorite = isFavorite
+        self.state = state
+        
         self.isFocused = isFocused
+        self.getAssetImage = getAssetImage
     }
     
     private func size() -> CGFloat {
@@ -64,12 +69,7 @@ struct ThumbnailImage: View {
         } else {
             ProgressView()
                 .onAppear {
-                    let asset = photosLibrary.asset(at: index)
-                    
-                    self.state = photosLibrary.state(of: asset)
-                    self.isFavorite = asset.isFavorite
-                    
-                    self.assetImage = photosLibrary.getThumbnail(for: asset)
+                    self.assetImage = getAssetImage()
                 }
         }
         

BlinkReviewer/Blink/Views/Thumbnails/ThumbnailList.swift (975) → BlinkReviewer/Blink/Views/Thumbnails/ThumbnailList.swift (1357)

diff --git a/BlinkReviewer/Blink/Views/Thumbnails/ThumbnailList.swift b/BlinkReviewer/Blink/Views/Thumbnails/ThumbnailList.swift
index c90f6e7..0dce571 100644
--- a/BlinkReviewer/Blink/Views/Thumbnails/ThumbnailList.swift
+++ b/BlinkReviewer/Blink/Views/Thumbnails/ThumbnailList.swift
@@ -14,7 +14,15 @@ struct ThumbnailList: View {
     var body: some View {
         ScrollViewReader { proxy in
             PHAssetHStack(assetIdentifiers: photosLibrary.assetIdentifiers) { localIdentifier, index in
-                ThumbnailImage(index: index, isFocused: index == focusedAssetIndex)
+                ThumbnailImage(
+                    index: index,
+                    state: photosLibrary.state(ofLocalIdentifier: localIdentifier),
+                    isFavorite: photosLibrary.isFavorite(localIdentifier: localIdentifier),
+                    isFocused: index == focusedAssetIndex,
+                    getAssetImage: {
+                        photosLibrary.getThumbnail(for: photosLibrary.asset(at: index))
+                    }
+                )
                 .environmentObject(photosLibrary)
                 .onTapGesture {
                     focusedAssetIndex = index