Проблема выбора изображения с mvvmcross и mono

Я использую следующие два метода для выбора изображения в папке изображений пользователей. Однако моя проблема заключается в том, что после каждого вызова ChoosePhotoForEventItem() кажется, что служба запоминает предоставленное действие (UploadImage). Это означает, что при втором вызове ChoosePhotoForEventItem() метод UploadImage запускается два раза, а при третьем — три раза. Я попытался преобразовать метод в свойство и установить для него значение null, тем самым ничего не меняя.

       public void ChoosePhotoForEventItem()
    {
        var picChooser = this.GetService<IMvxPictureChooserTask>();

        picChooser.ChoosePictureFromLibrary(MaxPixelDimension, DefaultJpegQuality,this.UploadImage,delegate {/*Do nothing on cancel*/});

    }

    private void UploadImage(Stream stream)
    {
        this.UploadImage(stream, ItemID);
    }

Любая помощь высоко ценится


person Bjarke    schedule 04.03.2013    source источник


Ответы (2)


Глядя на плагин, задача регистрируется для нового экземпляра для каждого вызова GetService.

        this.RegisterServiceType<IMvxPictureChooserTask, MvxImagePickerTask>();

в https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Plugins/PictureChooser/Cirrious.MvvmCross.Plugins.PictureChooser.Touch/Plugin.cs

Также похоже, что каждый экземпляр MvxImagePickerTask создает свой собственный UIImagePickerController в https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Plugins/PictureChooser/Cirrious.MvvmCross.Plugins.PictureChooser.Touch/MvxImagePickerTask..cs

Так что я не вижу ничего плохого в плагине, тем более что ваш код каждый раз вызывает var picChooser = this.GetService<IMvxPictureChooserTask>();.


У вас есть простой пример приложения, которое люди могут попробовать запустить для отладки?

Если нет, можете ли вы попробовать запустить что-то вроде:

private int _counter = 0;

public void ChoosePhotoForEventItem()
{
     _counter++;
     var localCounter =  _counter;
    var picChooser = this.GetService<IMvxPictureChooserTask>();

    picChooser.ChoosePictureFromLibrary(MaxPixelDimension, 
         DefaultJpegQuality,
         (stream) => this.SpecialUploadImage(stream, localCounter),
          delegate {/*Do nothing on cancel*/});
}

private void SpecialUploadImage(Stream stream, int theCounter)
{
    MvxTrace.Trace("Callback for localCounter {0}", theCounter);
    this.UploadImage(stream, ItemID);
}

След от этого поможет нам понять, какое действие вызывается три раза.

person Stuart    schedule 04.03.2013
comment
Привет, Стюарт, мы работаем не с новейшей версией mvvm, а с веткой под названием Master. Это тоже может что-то сказать, и я должен был поместить это в пост. Мы планируем перейти на vNext в ближайшем будущем. - person Bjarke; 05.03.2013
comment
В мастере (этому коду уже 12 месяцев) сборщик представляет собой одноэлементный элемент — github.com/slodge/MvvmCross/blob/master/Cirrious/ — поэтому вам нужно найти способ обойти это. Может быть, проще всего написать свою собственную версию, не являющуюся синглтоном - с открытым исходным кодом для победы :) - person Stuart; 05.03.2013
comment
Привет, Стюарт, я сделал быстро исправить на данный момент. Мы планируем перейти к vNext, что в конечном итоге решит проблему :) - person Bjarke; 05.03.2013

Проблема в том, как указывает Стюарт, что служба, которую я использую, является одноэлементной, и она не создается каждый раз, когда я использую службу. Поэтому на данный момент я делаю быстрое исправление с помощью простого логического значения, чтобы избежать нежелательной загрузки. Стюарт сообщил мне, что версия mvvm, которую я использую, довольно старая. Так что, похоже, переход на vNext в ближайшем будущем — единственный путь вперед.

person Bjarke    schedule 05.03.2013