MvxDynamicImageHelper不可靠

时间:2013-06-21 15:19:39

标签: mvvmcross

我有一个Mvx基础iOS项目,它有图像下载问题。

我有几个包含UICollectionViews的屏幕,UICollectionViewCells使用MvxDynamicImageHelpers将其UIImageViews的图像设置为托管在互联网上的图像(实际上是通过Azure CDN进行Azure blob存储)。我注意到图像有时不会出现,并且这在慢速连接时更常见,如果我在加载图像时滚动整个UICollectionView - 可能是因为它启动了大量的同时下载。重新启动应用程序会导致显示一些(但不是全部)图像。

查看Caches / Pictures.MvvmCross文件夹,我看到有许多文件的扩展名为.tmp,有些文件没有.tmp扩展名,但文件大小为0字节。我假设.tmp文件是在应用程序重新启动后重新下载的文件,并且无效的内存缓存条目导致它们在发生这种情况之前不会被重新下载。

我已经实现了我的MvxDownloadRequest版本和MvxHttpFileDownloader并注册了我的IMvxHttpFileDownloader。 MvxHttpFileDownloader中唯一的修改是使用我的MvxDownloadRequest而不是标准的Mvx。

据我所知,MvxDownloadRequest.Start或MvxDownloadRequest.ProcessResponse和MvxDownloadRequest.FileDownloadFailed没有被调用。用以下内容替换MvxDownloadRequest.Start后,所有图像始终下载并成功显示:

        try
        {
            ThreadPool.QueueUserWorkItem((state) => {
                try
                {
                    var fileService = this.GetService<IMvxSimpleFileStoreService>();
                    var tempFilePath = DownloadPath + ".tmp";

                    var imageData = NSData.FromUrl(NSUrl.FromString(Url));

                    var image = UIImage.LoadFromData(imageData);

                    NSError nsError;
                    image.AsPNG().Save(tempFilePath, true, out nsError);

                    fileService.TryMove(tempFilePath, DownloadPath, true);
                }
                catch (Exception exception)
                {
                    FireDownloadFailed(exception);
                    return;
                }

                FireDownloadComplete();
            });
        }
        catch (Exception e)
        {
            FireDownloadFailed(e);
        }

那么,什么可能导致标准WebRequest的问题不影响上述版本?我猜这是GC的一些东西,并且当我有时间时会做进一步的调试,但不幸的是,这不会有一段时间。如果有人能够回答这个问题或者在我看到它时提供指示,我们将非常感激。

谢谢,

Ĵ

1 个答案:

答案 0 :(得分:1)

从你到目前为止的调查描述中,听起来你已经将问题分解到httpwebrequest有时会失败的程度,但是NSData方法是100%可靠的。

如果是这种情况,则表明问题出现在xamarin.ios网络堆栈中或使用它的位置。

可能值得检查xamarin bugzilla存储库,并询问他们的支持团队是否了解此区域中的任何问题。我相信他们确实发了一些关于iOS网络变化的声明 - 请参阅视频后期的CFNetworkHandler部分和幻灯片http://xamarin.com/evolve/2013#session-b3mx6e6rmb - 这里有令人担忧的问题,如iPhone app gets into a state where network requests never complete

除此之外,我猜任何调试的第一步都是在一个简单的测试应用程序中隔离问题 - 例如,一次只下载一个图像的简单应用程序,并演示每个图像的简单通过/失败技术。如果您可以在一个小型测试应用程序中复制该问题,那么解决问题的速度会快得多。