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