2012-06-20 49 views
0

我有一個從服務器下載爲json文件的產品列表。每個項目都包含指向存儲在服務器上的圖像的鏈接。如何使用forge.file.cacheURL正確地緩存許多圖像(在循環中)?

現在我希望能夠在脫機時看到產品,因此我將下載的json文件存儲到forge.prefs​​並將其拉出以顯示屏幕上的項目。它工作得很好,但我也需要存儲圖像本地以正確顯示。

爲了達到此目的,我試圖使用forge.file.cacheURL http://docs.trigger.io/en/v1.3/features/cache.html但無法處理正確的操作順序。爲了緩存圖像,我運行json文件,併爲每一行調用forge.file.cacheURL並將url存儲回JSON項目。但是這裏是問題,因爲forge.file.cacheURL異步運行,所以我的循環遍歷項目並收集本地圖像完成,我的代碼繼續顯示圖像(查看項目),但同時forge.file.cacheURL仍然收集並緩存圖像,因爲它的異步操作。我需要以某種方式檢測最後一個項目被緩存,然後刷新屏幕上的視圖以使用正確的圖像URL或其他將導致我需要的東西。

希望你能理解這個概念。我應該如何正確處理這個問題?

+0

你能共享代碼片斷這說明什麼問題?不太確定我遵循! –

+0

答案可能涉及很長的答案。這些圖像在「瀏覽器」中有些緩存。你在使用backbone.js嗎? –

+0

我知道瀏覽器會緩存圖像,如果系統從內存中移除您的應用程序並刪除整個瀏覽器緩存,則會出現問題。 forge.pref可以存活這是偉大的... –

回答

0

從v1.4.26開始,您就可以永久存儲圖像(請參閱http://docs.trigger.io/en/v1.4/release-notes.html#v1-4-26),而不是僅緩存它們。根據您的需要,這可能是一個比forge.file.cacheURLforge.file.isFile更好的選項。

我不完全地按照你的描述是這樣的情況,但有些事會讓你等待幾個異步事情做某件事之前完成:

// e.g. 
var jsonCache = { 
    one: "http://example.com/one.jpg", 
    two: "http://example.com/two.jpg", 
    three: "http://example.com/three.jpg" 
}; 

var cacheCount = 0; 
for (var name in jsonCache) { 
    if (jsonCache.hasOwnProperty(name)) { 
     var imageURL = jsonCache[name]; 
     cacheCount += 1; 
     forge.file.cacheURL(imageURL, function (file) { 
      forge.prefs.set(name, file, function() { 
       cacheCount -= 1; // race condition, but should be fine (!) 
       if (cacheCount <= 0) { 
        alert('all cached'); 
       } 
      }); 
     }); 
    } 
}