4

イメージのダウンロードに問題がある Mvx ベース iOS プロジェクトがあります。

UICollectionViews を含む画面がいくつかあり、UICollectionViewCells は MvxDynamicImageHelpers を使用して、UIImageViews のイメージをインターネット上でホストされているイメージに設定します (実際には Azure CDN を介した Azure BLOB ストレージ)。画像が表示されないことがあり、これは接続が遅い場合に一般的であり、画像の読み込み中に UICollectionView 全体をスクロールすると、おそらく多数の同時ダウンロードが開始されることに気付きました。アプリを再起動すると、すべてではなく一部の画像が表示されます。

Caches/Pictures.MvvmCross フォルダを見ると、拡張子が .tmp のファイルと、拡張子が .tmp でなくファイル サイズが 0 バイトのファイルがいくつかあることがわかります。.tmp ファイルは、アプリの再起動後に再ダウンロードされるファイルであり、無効なメモリ内キャッシュ エントリが原因で、これが発生するまで再ダウンロードされないと推測されます。

私のバージョンの MvxDownloadRequest と MvxHttpFileDownloader を実装し、IMvxHttpFileDownloader を登録しました。MvxHttpFileDownloader の唯一の変更点は、標準の Mvx の代わりに私の MvxDownloadRequest を使用することです。

私が見る限り、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に関係していると推測しており、時間があればさらにデバッグを行いますが、残念ながらこれはしばらくの間ではありません. 誰かがこれに答えたり、私がそれを見たときの指針を提供したりできれば、非常にありがたいです.

ありがとう、

J

4

1 に答える 1

1

これまでの調査の説明から、httpwebrequest が時々失敗するレベルまで問題を切り分けたように思えますが、NSData メソッドは 100% 信頼できます。

この場合、問題は xamarin.ios ネットワーク スタックのどこかにあるか、またはその使用にあることが示唆されます。

xamarin の bugzilla リポジトリを確認し、サポート チームにこの分野の問題を認識しているかどうか尋ねることも価値があるかもしれません。彼らは evolve での iOS ネットワークの変更について何らかの発表を行ったと思います - ビデオの後半にある CFNetworkHandler の部分とhttp://xamarin.com/evolve/2013#session-b3mx6e6rmbのスライドを参照してください- ここには心配な質問がありますiPhone アプリのように、ネットワーク リクエストが完了しない状態になる

それを超えて、デバッグの最初のステップは、単純なテストアプリで問題を特定することだと思います-たとえば、一度に1つの画像をダウンロードするだけで、各手法の単純な成功/失敗を示す単純なアプリ. 小さなテスト アプリで問題を再現できれば、問題の原因をより迅速に突き止めることができます。

于 2013-06-22T17:08:03.717 に答える