4

我有一个 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 有关,当我有时间时会做进一步的调试,但不幸的是这不会有一段时间。如果有人能回答这个问题或提供我何时查看它的指示,将不胜感激。

谢谢,

Ĵ

4

1 回答 1

1

从到目前为止的调查描述来看,听起来您已将问题隔离到 httpwebrequest 有时会失败的级别,但 NSData 方法是 100% 可靠的。

如果是这种情况,则表明问题出在 xamarin.ios 网络堆栈或使用它的某个地方。

检查 xamarin bugzilla 存储库并询问他们的支持团队是否知道这方面的任何问题可能是值得的。我相信他们确实在 Evolution 发布了一些关于 iOS 网络变化的公告 - 请参阅视频后期的 CFNetworkHandler 部分和http://xamarin.com/evolve/2013#session-b3mx6e6rmb上的幻灯片 - 这里有令人担忧的问题就像iPhone 应用程序进入网络请求永远不会完成的状态

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

于 2013-06-22T17:08:03.717 回答