使用mvvmcross和mono选择图像的问题

时间:2013-03-04 16:23:08

标签: image xamarin.ios mvvmcross

我使用以下两种方法在用户图像文件夹中选择图像。但是我的问题是,每次调用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);
    }

非常感谢任何帮助

2 个答案:

答案 0 :(得分:2)

查看插件,每次调用GetService

时,都会为新实例注册任务
        this.RegisterServiceType<IMvxPictureChooserTask, MvxImagePickerTask>();
https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Plugins/PictureChooser/Cirrious.MvvmCross.Plugins.PictureChooser.Touch/Plugin.cs

中的

看起来每个MvxImagePickerTask实例在https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Plugins/PictureChooser/Cirrious.MvvmCross.Plugins.PictureChooser.Touch/MvxImagePickerTask.cs

中创建自己的UIImagePickerController

所以我无法在插件中发现任何错误,特别是因为您的代码每次都在调用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);
}

从中获取的痕迹将有助于我们计算出三次被调用的动作

答案 1 :(得分:2)

问题是,正如Stuart所指出的那样,我使用的服务是单例,并且每次使用该服务时都不会实例化。因此,就目前而言,我正在使用简单的布尔值进行快速修复,以避免任何不必要的上传。斯图尔特告诉我,我使用的mvvm版本已经很老了。因此,似乎在最近的将来切换到vNext是唯一的前进方式。