我有一个 Mvx 基础 iOS 项目,该项目在图像下载方面存在问题。
我有几个包含 UICollectionViews 的屏幕,并且 UICollectionViewCells 使用 MvxDynamicImageHelpers 将其 UIImageViews 的图像设置为托管在 Internet 上的图像(实际上是通过 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 有关,当我有时间时会做进一步的调试,但不幸的是这不会有一段时间。如果有人能回答这个问题或提供我何时查看它的指示,将不胜感激。
谢谢,
Ĵ