PHPhoto localIdentifier to cloudIdentifier conversion

The sample code in the Apple documentation found in  PHCloudIdentifier does not compile in xCode 13.2.1.

Can the interface for identifier conversion be clarified so that the answer values are more accessible/readable. The values are 'hidden' inside a Result enum

It was difficult (for me) to rewrite the sample code because I made the mistake of interpreting the Result type as a tuple. Result type is really an enum.

Using the Result type as the return from library.cloudIdentifierMappings(forLocalIdentifiers: ) and .localIdentifierMappings( for: ) puts the actual mapped identifiers inside the the enum where they need additional access via a .stringValue message or an evaluation of an element of the result enum.

For others finding the same compile issue, here is a working version of the sample code. This compiles in xCode 13.2.1.

func localId2CloudId(localIdentifiers: [String]) -> [String] {

        var mappedIdentifiers = [String]()

       let library = PHPhotoLibrary.shared()
        let iCloudIDs = library.cloudIdentifierMappings(forLocalIdentifiers: localIdentifiers)

        for aCloudID in iCloudIDs {
           let cloudResult: Result = aCloudID.value
            // Result is an enum .. not a tuple

            switch cloudResult {

                case .success(let success):
                    let newValue = success.stringValue
                    mappedIdentifiers.append(newValue)

                case .failure(let failure):
                    // do error notify to user          
            }
        }
        return mappedIdentifiers
    }

``` swift func

func cloudId2LocalId(assetCloudIdentifiers: [PHCloudIdentifier]) -> [String] {
            // patterned error handling per documentation

        var localIDs = [String]()
        let localIdentifiers: [PHCloudIdentifier: Result<String, Error>]  = PHPhotoLibrary.shared() .localIdentifierMappings(
                  for: assetCloudIdentifiers)
        for cloudIdentifier in assetCloudIdentifiers {

            guard let identifierMapping = localIdentifiers[cloudIdentifier] else {
                print("Failed to find a mapping for \(cloudIdentifier).")
                continue
            }

            switch identifierMapping {
                case .success(let success):
                    localIDs.append(success)

                case .failure(let failure) :
                    let thisError = failure as? PHPhotosError
                    switch thisError?.code {
                        case .identifierNotFound:
                            // Skip the missing or deleted assets.
                            print("Failed to find the local identifier for \(cloudIdentifier). \(String(describing: thisError?.localizedDescription)))")

                        case .multipleIdentifiersFound:
                            // Prompt the user to resolve the cloud identifier that matched multiple assets.

                            print("Found multiple local identifiers for \(cloudIdentifier). \(String(describing: thisError?.localizedDescription))")

//                            if let selectedLocalIdentifier = promptUserForPotentialReplacement(with: thisError.userInfo[PHLocalIdentifiersErrorKey]) {
//                                localIDs.append(selectedLocalIdentifier)

                        default:
                            print("Encountered an unexpected error looking up the local identifier for \(cloudIdentifier). \(String(describing: thisError?.localizedDescription))")
                    }
              }
            }

        return localIDs

    }

New version (iOS 18.1.1) problem with cloudIdentifierMappings(forLocalIdentifiers:) is causing me dataStore errors.

The method is now acting like it has a completionBlock return . The initial return is with an error result. Inspecting a little later in the debugger shows a changed return with the expected cloudIdentifiers.

You would think that wrapping it in the NSManagedObjectContext.performAndWait would be a quick fix.. but on my first try performAndWait did not improve the situation.

Any ideas??? THANKS

PHPhoto localIdentifier to cloudIdentifier conversion
 
 
Q