2013-06-21 38 views
4

我有一個Mvx基本的iOS項目,它有圖像下載的問題。MvxDynamicImageHelper不可靠

我有一對夫婦包含UICollectionViews和UICollectionViewCells使用MvxDynamicImageHelpers自己的UIImageViews的圖片設置爲託管在互聯網(Azure的BLOB通過Azure的CDN在實際上存儲)圖像屏幕。我注意到圖像有時不會出現,並且在較慢的連接上以及如果在圖像加載時滾動瀏覽整個UICollectionView,這種情況更常見 - 大概是因爲它啓動了大量的同時下載。重新啓動應用程序會導致顯示一些但不是全部的圖像。

展望緩存/ 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

從你的調查到目前爲止的描述,這聽起來像您已隔離問題下降到HttpWebRequest的有時會失敗的水平,但NSData的方法是100%可靠。

如果是這種情況,那麼它會提示問題出在xamarin.ios網絡堆棧或使用它的地方。

這可能是值得檢查xamarin的Bugzilla庫,並要求他們的支持團隊,如果他們知道在這方面的任何問題。我相信他們確實做出更改的iOS在網絡演變的一些公告 - 見http://xamarin.com/evolve/2013#session-b3mx6e6rmb的CFNetworkHandler部分在視頻後期和幻燈片 - 有在這裏令人擔憂的問題,如iPhone app gets into a state where network requests never complete

除此之外,我猜任何調試的第一步都是在一個簡單的測試應用程序中隔離問題 - 例如一個簡單的應用程序,它只需一次下載一個圖像,並且對每種技術演示簡單的通過/失敗。如果您可以在一個小測試應用程序中複製問題,那麼解決問題會更快。