2013-03-04 1 views
3

IAM en utilisant les deux méthodes suivantes pour choisir une image dans le dossier image de l'utilisateur. Cependant, mon problème est, après chaque appel de ChoosePhotoForEventItem(), il semble que le service se souvient de l'action fournie (UploadImage). Cela signifie que la seconde fois que ChoosePhotoForEventItem() est appelée, la méthode UploadImage est déclenchée deux fois et la troisième fois, elle est déclenchée trois fois. J'ai essayé de convertir la méthode en une propriété et la mettre à null, par cela ne changez rien.Problème lors du choix de l'image avec mvvmcross et 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); 
    } 

Toute aide est très appréciée

Répondre

2

regardant le plug-in, la tâche est enregistrée pour une nouvelle instance pour chaque appel à GetService

 this.RegisterServiceType<IMvxPictureChooserTask, MvxImagePickerTask>(); 

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

Il semble aussi comme chaque instance MvxImagePickerTask crée son propre UIImagePickerController dans https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Plugins/PictureChooser/Cirrious.MvvmCross.Plugins.PictureChooser.Touch/MvxImagePickerTask.cs

Donc, je ne peux pas trouver quelque chose de mal dans le plugin, d'autant plus que votre code appelle var picChooser = this.GetService<IMvxPictureChooserTask>(); à chaque fois.


Avez-vous un simple exemple d'application que tout le monde peut essayer de déboguer?

Sinon, pouvez-vous essayer d'exécuter quelque chose comme:

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

La trace de qui nous aiderait à travailler à ce que l'action est appelé trois fois

+0

Salut Stuart, nous ne travaillons pas avec la nouvelle version de mvvm, mais la branche appelée Master. Cela pourrait avoir quelque chose à dire aussi et j'aurais dû le mettre dans le post. Nous prévoyons de passer à vNext dans un proche avenir cependant. – Bjarke

+0

En maître (ce code est comme 12 mois maintenant) le sélecteur est un singleton - https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Touch/Platform/MvxTouchServiceProvider.cs#L72 - Vous devrez donc contourner le problème. Peut-être plus facile d'écrire votre propre version non-singleton - open source pour la victoire :) – Stuart

+0

Salut, Stuart, j'ai fait une solution rapide pour l'instant. Nous prévoyons de passer à vNext, ce qui permettra de résoudre le problème finalement :) – Bjarke

2

La question est, comme le souligne Stuart sur, que le service que j'utilise est un singleton et qu'il n'est pas instancié chaque fois que j'utilise le service. Par conséquent, pour l'instant, je suis en train de faire une solution rapide avec un simple booléen pour éviter tout téléchargement indésirable. Stuart m'a informé que la version de mvvm que j'utilise est assez ancienne. Il semble donc que le passage à vNext dans un proche avenir est la seule voie à suivre.

Questions connexes