RequestContentEditingInput completeHandler не запускается - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть приложение, в котором мне нужно выбрать изображения с телефона и отобразить их в том порядке, в котором пользователь их выбрал (мне нужны 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

1 Ответ

0 голосов
/ 03 декабря 2018

Если у кого-то в будущем возникнет такая же проблема.Используйте PHImageManager.DefaultManager.RequestImageData () вместо PHAsset.RequestContentEditingInput (), так как он не падает, если вы попросите его обработать много изображений.

Я делаю что-то вроде:

    var fetchOptions = new PHFetchOptions();
    PHFetchResult allPhotos = PHAsset.FetchAssets(PHAssetMediaType.Image, fetchOptions);
    _numberofImg = allPhotos.Count;
    Debug.WriteLine("Total img no + " + _numberofImg);
    await Task.Yield();
    await Task.Run(() => ImgProcess(allPhotos));
    return true;

private void ImgProcess(PHFetchResult allPhotos)
{
    //await Task.Run(() =>
    //{
        for (nint i = 0; i < allPhotos.Count; i++)
        {
            Debug.WriteLine("Starting " + i);
            var phasset = allPhotos[i] as PHAsset;
            var options = new PHImageRequestOptions()
            {
                Synchronous = true,
                NetworkAccessAllowed = false,
                DeliveryMode = PHImageRequestOptionsDeliveryMode.FastFormat
            };
            PHImageManager.DefaultManager.RequestImageData(phasset, options, ComplManager);
        }
    //});
    //return;
}

, даже если у этого решения все еще есть проблемы, когда количество изображений превышает 300 ...

...