public Task<string> GetAlbumLocalIdentifier () { if (albumLocalIdTcs == null || (int)albumLocalIdTcs.Task.Status >= 5) { albumLocalIdTcs = new TaskCompletionSource<string> (); } else if ((int)albumLocalIdTcs.Task.Status <= 4) { return albumLocalIdTcs.Task; } PHPhotoLibrary.RequestAuthorization(async status => { if (status == PHAuthorizationStatus.Authorized) { if (!string.IsNullOrEmpty(albumLocalIdentifier)) { albumLocalIdTcs.TrySetResult(albumLocalIdentifier); } else { var keychain = new Keychain<TrapAlbum> (new TrapAlbum ()); var values = keychain.GetStoredKeyValues(); var identifier = values.ContainsKey(DataKeys.LocalIdentifier) ? values[DataKeys.LocalIdentifier] : null; if (identifier != null) { // ensure the album with that localIdentifier is there var collection = PHAssetCollection.FetchAssetCollections(new [] { identifier }, null)?.firstObject as PHAssetCollection; if (collection != null) { albumLocalIdentifier = identifier; if (!albumLocalIdTcs.TrySetResult(identifier)) { var ex = new Exception ("GetAlbumLocalIdentifier Failed"); albumLocalIdTcs.TrySetException(ex); // Log.Error(ex); } } else { if (!albumLocalIdTcs.TrySetResult(await createAlbumAndSaveLocalIdentifier())) { var ex = new Exception ("GetAlbumLocalIdentifier Failed"); albumLocalIdTcs.TrySetException(ex); // Log.Error(ex); } } } else { if (!albumLocalIdTcs.TrySetResult(await createAlbumAndSaveLocalIdentifier())) { var ex = new Exception ("GetAlbumLocalIdentifier Failed"); albumLocalIdTcs.TrySetException(ex); // Log.Error(ex); } } } } else { var ex = new Exception ("Unauthorized"); albumLocalIdTcs.TrySetException(ex); // Log.Error(ex); } }); return albumLocalIdTcs.Task; }