Skip to content

Instantly share code, notes, and snippets.

@JadenGeller
Created February 28, 2024 02:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JadenGeller/15d2d90f38347ebe105cfef5cf6fb530 to your computer and use it in GitHub Desktop.
Save JadenGeller/15d2d90f38347ebe105cfef5cf6fb530 to your computer and use it in GitHub Desktop.
Helper to temporarily unhide assets (for working around bug in PhotoKit where cloud ID of hidden assets cannot be accessed)
extension PHPhotoLibrary {
// RADAR: https://feedbackassistant.apple.com/feedback/13660931
func withTemporarilyUnhiddenAssets<Success>(_ assets: [PHAsset], _ block: () async throws -> Success) async throws -> Success {
var collectionPlaceholder: PHObjectPlaceholder?
try await performChanges {
let collectionChange = PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: "Temporarily Unhidden Assets")
collectionPlaceholder = collectionChange.placeholderForCreatedAssetCollection
collectionChange.insertAssets(assets as NSArray, at: IndexSet((0...).prefix(assets.count)))
for asset in assets {
precondition(asset.isHidden)
let assetChange = PHAssetChangeRequest(for: asset)
assetChange.isHidden = false
}
}
let result = await Result { try await block() }
do {
let collection = PHAssetCollection.fetchAssetCollections(withLocalIdentifiers: [collectionPlaceholder!.localIdentifier], options: nil).firstObject!
try await performChanges {
for asset in assets {
let assetChange = PHAssetChangeRequest(for: asset)
assetChange.isHidden = true
}
PHAssetCollectionChangeRequest.deleteAssetCollections([collection] as NSArray)
}
} catch let error {
print("SERIOUS ERROR! PHOTOS NOT RE-HIDDEN!!", error)
throw error
}
return try result.get()
}
}
extension Result where Failure == Error {
init(catching body: () async throws -> Success) async {
do {
self = .success(try await body())
} catch let error {
self = .failure(error)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment