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
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