У меня есть приложение, в котором мне нужно выбрать изображения с телефона и отобразить их в том порядке, в котором пользователь их выбрал (мне нужны img в выбранном порядке, а не «последние отредактированные», поэтому я не использую UIImagePickerController)
Для этого у меня есть страница, которая показывает последние 50 изображений с возможностью загрузки большего количества.
Я получаю путь к изображению и ориентацию с этим кодом ниже.
Моя проблема: CompletionHandler (в RequestContentEditingInput) будет работать только 17 раз ... Я вижу, что RequestContentEditingInput вызывается для каждого изображения (на этом телефоне 138 раз)
Я пытался ждать, но ничегопроисходит.
Код работает так, как задумано, когда у меня меньше 17 изображений ...
Я попытался реализовать блокировку SemaphoreSlim в коде CompletionHandler, чтобы контролировать, что я буду обрабатывать только 10 изображенийв то время, но конечный результат был одинаковым, или изображения вообще не обрабатывались.
UpdateInfo: Кажется, еговсе живые фотографии, которые не обрабатываются.
У кого-нибудь есть идеи о том, что здесь происходит?
Идея исправления?
Есть ли другой способ, которым я могу получитьвсе пути к изображениям и ориентация?
Или совершенно другое решение, позволяющее пользователю выбирать изображения с телефона и получать порядок, в котором пользователь их выбрал?
public class GalleryHelper : IGalleryHelper
{
private List<(string, string, string)> _retval;
private nint _numberofImg = 0;
private nint _currentImg = 0;
public List<(string, string, string)> GetAllImgFromGallery()
{
_retval = new List<(string, string, string)>();
_currentImg = 0;
GetAllImg();
return _retval;
}
private void GetAllImg()
{
var fetchOptions = new PHFetchOptions();
PHFetchResult allPhotos = PHAsset.FetchAssets(PHAssetMediaType.Image, fetchOptions);
_numberofImg = allPhotos.Count;
Debug.WriteLine("Total img no + " + _numberofImg);
for (nint i = 0; i < allPhotos.Count; i++)
{
Debug.WriteLine("Starting " + i);
(allPhotos[i] as PHAsset).RequestContentEditingInput(new PHContentEditingInputRequestOptions(), CompletionHandler);
}
}
private void CompletionHandler(PHContentEditingInput contentEditingInput, NSDictionary requestStatusInfo)
{
Debug.WriteLine("Starting CompletionHandler " + (1 + _currentImg));
var path = contentEditingInput.FullSizeImageUrl.Path;
if (path != null)
{
var orientation = contentEditingInput.FullSizeImageOrientation;
switch (orientation)
{
case CIImageOrientation.TopLeft:
//Standard position
_retval.Add((path, null, "0"));
break;
case CIImageOrientation.LeftBottom:
//Rotate 90 degrees clockwise
_retval.Add((path, null, "-90"));
break;
case CIImageOrientation.RightTop:
//Rotate 90 degrees counterclockwise
_retval.Add((path, null, "90"));
break;
case CIImageOrientation.BottomRight:
//Rotate 180 degrees
_retval.Add((path, null, "180"));
break;
case CIImageOrientation.BottomLeft:
//Mirror image rotated 180 degrees
_retval.Add((path, null, "180"));
break;
case CIImageOrientation.TopRight:
//Mirror image
_retval.Add((path, null, "0"));
break;
case CIImageOrientation.LeftTop:
//Mirror image rotate 90 degrees clockwise
_retval.Add((path, null, "-90"));
break;
case CIImageOrientation.RightBottom:
//Mirror image rotate 90 degrees counterclockwise.
_retval.Add((path, null, "90"));
break;
default:
_retval.Add((path, null, "0"));
break;
}
}
_currentImg++;
Debug.WriteLine("Images done " + _currentImg);
MessagingCenter.Send((App)Xamarin.Forms.Application.Current, "ImagesReady", _retval);
}
}
Вставка из моего DebugВыход на пробег:
[0:] Total img no + 138
[0:] Starting 0
[0:] Starting 1
(...)
[0:] Starting 137
[0:] Starting CompletionHandler 1
[0:] Images done 1
[0:] Starting CompletionHandler 2
[0:] Images done 2
[0:] Starting CompletionHandler 3
[0:] Images done 3
(...)
[0:] Starting CompletionHandler 15
[0:] Images done 15
[0:] Starting CompletionHandler 16
[0:] Images done 16
[0:] Starting CompletionHandler 17
[0:] Images done 17
Thread started: #17
Thread finished: #15
The thread 0xf has exited with code 0 (0x0).
Thread finished: #3