3

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

非常感谢任何帮助

4

2 回答 2

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

从中得到的痕迹将帮助我们弄清楚什么动作被调用了 3 次

于 2013-03-04T16:35:40.423 回答
2

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

于 2013-03-05T19:06:38.017 回答