2013-03-04 4 views
3

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

 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); 
    } 

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

ответ

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); 
} 

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

+0

Привет, Стюарт, мы не работаем с новейшей версией mvvm, но веткой называется Master. Это могло бы что-то сказать, а я должен был положить его в почту. Однако мы планируем перейти к vNext в ближайшем будущем. – Bjarke

+0

В главном (этот код похож на 12 месяцев) сборщик представляет собой однотонный элемент - https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Touch/Platform/MvxTouchServiceProvider.cs#L72 - так что вам нужно будет разобраться в этом. Может быть, проще всего написать свою собственную версию, отличную от одиночной версии - с открытым исходным кодом для победы :) – Stuart

+0

Привет, Стюарт, я сделал быстрое решение. Мы планируем перейти на vNext, что в конечном итоге решит проблему :) – Bjarke

2

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