読者です 読者をやめる 読者になる 読者になる

TitaniumMobile勉強記

Web系エンジニア向けのキャリアアドバイザーやってましたが現在はフリーランスで開発含めて色々やってます。技術ネタとしてはRuby/RailsとJavaScript関連(Node.js、Titanium)あたり

041-エントリ情報をローカルにキャッシュする処理実装しました

前回のエントリで下記のようなことを書きました。

※このブログを書き始めてコード読み返していて気づいたのですが、ローカルのキャッシュ処理する際にブロガー毎にキャッシュするようにしてないから、この部分は別途書きなおす必要が有る。。

Titanium.App.EntryCache というグローバルにアクセスできる変数に、エントリ情報を突っ込んでしまっているため

  1. oyamadaというブロガーのエントリを読んでいた
  2. その後hibiというブロガーのエントリを読み始めた
  3. oyamadaというブロガーのエントリはすでに1.で読み込み済なのでキャッシュから取得したい

という場合に意図した動作しないかと思って、この部分の修正を考えました

twitter眺めていたら、gihyoのTitanium Mobileで作る! iPhone/Androidアプリの連載記事で第9回 データの永続化というものが目に止まりこれを参考にすることにしました

まずはテストコード

これまでViewのコードばっかり書いており、そういう部分のテストコードの書き方を自分が知らないので放置気味でしたが、今回取り組む箇所はテスト書きやすい所なのでこんなテストコードを準備しました

QunitをTitaniumから利用出来るようにしています。詳しくは以前のエントリなどを
009-TitaniumのユニットテストでQUnitを使う
011-ユニットテスト実行時の別ファイルからオブジェクトを読み込む処理にはまる
ブロガー名+現在のページ数.jsonというファイル名でローカルにキャッシュすることを想定してます。

//test_entry.js
Ti.include('model/entry.js');
Ti.include('view/create_table_view.js');
Ti.include('view/styles.js');

module("Entry");

test("initialize",
  function(){
    var entry = new Entry('hibi');
    var _obj = typeof entry;
    equals(_obj,"object");
  }
);

test("save cache",
  function(){
    var entry = new Entry('hibi');
    var result = entry.saveCache();
    equals(result,true);
  }
);

test("load cache",
  function(){
    // hibi1.jsonを読み取り、4番目のpermalinkの値を検証
    expect(1);
    var blogger = 'hibi';
    var page_number = 1;
    var entry = new Entry(blogger);
    var fileName = blogger + page_number + ".json";
    var file_path = Titanium.Filesystem.resourcesDirectory
	+ '/cache/'
	+ fileName;

    var data = entry.loadCache(file_path);
    var link = data[3].permalink;

    equals(link,"http://blog.pasonatech.co.jp/hibi/399/1819.html");
  }
);

テストにパスするコード

var Entry = function(blogger){
 //中略
};
Entry.prototype = {
  //中略
  saveCache:function(json,page_number){

    var fileName = this.blogger + page_number + ".json";
    var file_path = Titanium.Filesystem.resourcesDirectory
	+ '/cache/'
	+ fileName;
    var file  = Titanium.Filesystem.getFile(file_path);
    file.write(json);
    return true;
  },
  loadCache:function(filename){
    var file  = Titanium.Filesystem.getFile(filename);
    var json = file.read();
    var data = JSON.parse(json);
    return data;
  }
};