Windows Phone数据和内存的最佳方式

时间:2013-08-17 06:10:04

标签: performance windows-phone-7 windows-phone-8 windows-phone

我正在设计Windows Phone应用程序 该应用程序将从互联网(JSON流)下载一些数据。这样的流可以在尺寸上大得多,并且数量也是多个(大约30-40) 我希望应用程序具有非常高的性能,并使用这样的流实现某种缓存机制 保留此类数据的最佳方法是什么。在Multiple VariablesUse File Storage

1 个答案:

答案 0 :(得分:0)

我不确定这是最好的方法,但我所做的是:

  • 首次从网上下载数据(JSON流)
  • 具有每个项目的缓存持续时间,具体取决于类型
  • 直接将其存储在IsolatedStorage中,文件大小或文件数量没有限制,您可以有效地存储在那里,请记住不要过分。
  • 我不需要快速查询部分数据的数据,而是完全使用数据,这对我来说比使用数据库要好得多。

这是我的设置:

Backend是一个WebAPI应用程序,它返回数据传输对象的可用数据。

手机应用程序共享相同的数据传输对象,并具有Repository类 - 它公开了以下方法。

我有一个SimpleRepository抽象类,它暴露了以下抽象方法:

Fetch(string query); //fetch the data from the data source
Store(); // Store the data somewhere

根据这些内容,它会为您实现First(string query) Fetch()First()

然后,我有一个CachingRepository类,如果可用则在本地加载数据,如果不是,则从Web加载,它假定是JSON。

它有一个构造函数,如下所示:

 CachingRepository(string name, CacheDuration duration,string id)

repo的名称与后端的资源相同,因此例如名为“Cats”的存储库在后端具有相应的/api/phone/Cats RESTful资源。 id用于将其与同一资源的其他存储库区分开来。 CacheDuration是我所拥有的常见缓存持续时间的枚举,但TimeSpan也可以工作。

存储库有两个通用参数 - T,它实现ViewModel<U>类(实现INotifyPropertyChanged并使用DTO作为模型 - 虽然这可能对您的使用来说太简单了)实现TipRanksDTO的U

Fetch看起来像:

public async Task<IEnumerable<T>> Fetch(string queryString)
{
    var localResult = await fetchFromLocal(queryString);
    if(localResult != null){
        return localResult;
    }
    return await fetchFromServer();
}

fetchFromLocal是一种私有异步方法,在验证文件未在缓存持续时间之前被修改后,从应用程序的IsolatedStorage获取数据。如果无法在本地获取,则会尝试使用HttpClient从Web获取。两者都使用Newtonsoft.JSON将文件/ Web响应直接转换为C#对象(我之前的DTO)。

现在,Store同样简单 - 只需打开IsolatedStorage并将DTO的序列化版本推送到数据库,它接受ViewModels。

每个ViewModel都有一个指向DTO的Model属性。如果使用DTO和模型对您不够,或者您希望以后将任何内容保存到服务器,您可能希望在DTO和模型之间有一个额外的步骤。

然后,用法如下:

 OnPageLoaded += (sender,args) => {
     var repo = new CachingRepository("Cats",CachingDuration.Daily);
     var cats = await repo.Fetch();
     pageViewModel.cats.Replace(cats); //update the ObservableCollection on the VM.
     repo.Store(cats);
 }