Skip to main content

Extract and document PHFetchResultCollection

ID
3005f5c
date
2023-06-09 19:09:06+00:00
author
Alex Chan <alex@alexwlchan.net>
parent
14e6e30
message
Extract and document PHFetchResultCollection
changed files
3 files, 37 additions, 14 deletions

Changed files

BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj (27732) → BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj (28240)

diff --git a/BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj b/BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj
index 85b8459..c7f3712 100644
--- a/BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj
+++ b/BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj
@@ -8,6 +8,7 @@
 
 /* Begin PBXBuildFile section */
 		940331732A336B5100200C5D /* DeferredRendering.swift in Sources */ = {isa = PBXBuildFile; fileRef = 940331722A336B5100200C5D /* DeferredRendering.swift */; };
+		94C5FFF22A33ADD4004ADDF5 /* PHFetchResultCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C5FFF12A33ADD4004ADDF5 /* PHFetchResultCollection.swift */; };
 		94D2C8B92A320E6F00BEE15B /* ReviewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94D2C8B82A320E6F00BEE15B /* ReviewState.swift */; };
 		94D2C8BD2A32796500BEE15B /* AlbumHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94D2C8BC2A32796500BEE15B /* AlbumHelpers.swift */; };
 		94D2C8BF2A3299BD00BEE15B /* PhotosLibrary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94D2C8BE2A3299BD00BEE15B /* PhotosLibrary.swift */; };
@@ -46,6 +47,7 @@
 
 /* Begin PBXFileReference section */
 		940331722A336B5100200C5D /* DeferredRendering.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeferredRendering.swift; sourceTree = "<group>"; };
+		94C5FFF12A33ADD4004ADDF5 /* PHFetchResultCollection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PHFetchResultCollection.swift; sourceTree = "<group>"; };
 		94D2C8B82A320E6F00BEE15B /* ReviewState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReviewState.swift; sourceTree = "<group>"; };
 		94D2C8BC2A32796500BEE15B /* AlbumHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumHelpers.swift; sourceTree = "<group>"; };
 		94D2C8BE2A3299BD00BEE15B /* PhotosLibrary.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotosLibrary.swift; sourceTree = "<group>"; };
@@ -98,6 +100,7 @@
 			isa = PBXGroup;
 			children = (
 				940331722A336B5100200C5D /* DeferredRendering.swift */,
+				94C5FFF12A33ADD4004ADDF5 /* PHFetchResultCollection.swift */,
 			);
 			path = Helpers;
 			sourceTree = "<group>";
@@ -329,6 +332,7 @@
 				94D2C8BD2A32796500BEE15B /* AlbumHelpers.swift in Sources */,
 				94D2C8BF2A3299BD00BEE15B /* PhotosLibrary.swift in Sources */,
 				94D7511E2A31B243005859E7 /* FullSizeImage.swift in Sources */,
+				94C5FFF22A33ADD4004ADDF5 /* PHFetchResultCollection.swift in Sources */,
 				94D750F02A31A796005859E7 /* BlinkReviewerApp.swift in Sources */,
 				940331732A336B5100200C5D /* DeferredRendering.swift in Sources */,
 				94D751202A31B53E005859E7 /* AlbumInfo.swift in Sources */,

BlinkReviewer/BlinkReviewer/Views/Helpers/PHFetchResultCollection.swift (0) → BlinkReviewer/BlinkReviewer/Views/Helpers/PHFetchResultCollection.swift (890)

diff --git a/BlinkReviewer/BlinkReviewer/Views/Helpers/PHFetchResultCollection.swift b/BlinkReviewer/BlinkReviewer/Views/Helpers/PHFetchResultCollection.swift
new file mode 100644
index 0000000..184c8fc
--- /dev/null
+++ b/BlinkReviewer/BlinkReviewer/Views/Helpers/PHFetchResultCollection.swift
@@ -0,0 +1,33 @@
+import Photos
+
+/// Implement a RandomAccessCollection for a PHFetchResult.
+///
+/// This wrapper allows us to use a PHFetchResult in a SwiftUI ForEach loop,
+/// for example:
+///
+/// ```swift
+/// let fetchResult = PHAsset.fetchAssets(…)
+/// let collection = PHFetchResultCollection(fetchResult: fetchResult)
+///
+/// var body: some View  {
+///     ForEach(collection, id: \.localIdentifier) {
+///         ...
+///     }
+/// }
+///
+/// This is based on code written by Slava Semeniuk on Stack Overflow:
+/// https://stackoverflow.com/q/62745595/1558022
+///
+struct PHFetchResultCollection: RandomAccessCollection, Equatable {
+    typealias Element = PHAsset
+    typealias Index = Int
+
+    let fetchResult: PHFetchResult<PHAsset>
+
+    var startIndex: Int { 0 }
+    var endIndex: Int { fetchResult.count }
+
+    subscript(position: Int) -> PHAsset {
+        fetchResult.object(at: position)
+    }
+}

BlinkReviewer/BlinkReviewer/Views/ThumbnailList.swift (3670) → BlinkReviewer/BlinkReviewer/Views/ThumbnailList.swift (3284)

diff --git a/BlinkReviewer/BlinkReviewer/Views/ThumbnailList.swift b/BlinkReviewer/BlinkReviewer/Views/ThumbnailList.swift
index 90f9378..01e9944 100644
--- a/BlinkReviewer/BlinkReviewer/Views/ThumbnailList.swift
+++ b/BlinkReviewer/BlinkReviewer/Views/ThumbnailList.swift
@@ -8,20 +8,6 @@
 import SwiftUI
 import Photos
 
-// https://stackoverflow.com/q/62745595/1558022
-struct PHFetchResultCollection: RandomAccessCollection, Equatable {
-    typealias Element = PHAsset
-    typealias Index = Int
-
-    let fetchResult: PHFetchResult<PHAsset>
-
-    var startIndex: Int { 0 }
-    var endIndex: Int { fetchResult.count }
-
-    subscript(position: Int) -> PHAsset {
-        fetchResult.object(at: position)
-    }
-}
 
 struct ThumbnailList: View {
     @EnvironmentObject var photosLibrary: PhotosLibrary