2010/09/12

DropboxSDKでの処理とハッシュの利用について

この文書ではiOS用のDropboxSDKを用いるにあたって気付いた注意点をいくつか述べます。もちろん、公式のドキュメントも参照してください。なお、DropboxSDKを利用可能な状態にするためには、以前のドキュメントを参照してください。

基本的な処理の流れ

SDKのソースやサンプルアプリケーションDBRouletteのソースを見ればだいたいわかると思いますが、次のようになっています。DBRestClientにはdelegateを設定しておく必要があります。

  1. DBRestClientのメソッドを呼ぶ (loadFile:intoPath:など)
  2. DBRestClientがファイルを取得し、delegateにメッセージを送信 (restClient:loadedFile:contentType:など)
  3. delegateが送信された内容に基づいて処理
状況によってはデータの取得に失敗して別のメッセージ(restClient:loadFileFailedWithError:など)が送信されることがあります。

注意点や効率化について

DropboxSDKの使用時の注意点や効率化についていくつか述べます。効率化については、簡単に言えばDropboxのサーバへの問い合わせを少なくすべきであるということになります。

  • Dropboxファイルシステムは大文字小文字を区別しないことに注意
  • 起動時にファイルツリーを走査しない。ディレクトリを開いたときにそこだけ見るようにする
  • なんでも勝手にダウンロードしない (ダウンロードするときはユーザに聞くこと)
  • ハッシュを利用する (詳しくは後述)
  • サムネイルのサイズはsmall (32x32), medium (64x64), large (128x128)以外にもiphone_bestfitがある

ハッシュについて (概要)

Dropboxではディレクトリごとにハッシュ値を持っており、ユーザがディレクトリ内にファイルを追加したり、ディレクトリ内のファイルの内容を変更した場合に、この値が変更します。逆に言えば、ハッシュ値が変更されていない場合にはそのディレクトリ内にあるファイルの内容には変化がないことが保証されます (もちろんハッシュ値ベースなので完全な保証ではありませんが)。

ハッシュ値の取得方法については、loadMetadata:でディレクトリを指定すると、restClient:loadedMetadata:で返されるDBMetadataのhashという変数に格納されます。このとき、次の点に注意してください。

  • ハッシュ値が取得できるのはloadMetadata:でディレクトリを指定したときのみ
  • ハッシュ値が取得できるのは指定したディレクトリのみで、contents内のファイルのハッシュ値はnilのまま
  • ハッシュ値は子ファイルを変更や追加や削除などをしたときのみのようです (子ディレクトリ内の変更は見ない)

ハッシュの利用 (1)

メタデータをキャッシュしてアクセス効率をよくします。

そのためには、メタデータを取得するときにloadMetdata:withHash:を利用してハッシュ値を指定します。これによって、指定したハッシュ値から変化がない場合には、restClient:loadedMetadata:ではなくrestClient:metadataUnchangedAtPath:が返されるようになります。

そこで、次のようにするとよいでしょう。

  • restClient:loadedMetadata:が呼ばれたときはハッシュ値とメタデータをキャッシュしておく
  • restClient:metadataUnchangedAtPath:が呼ばれたときはキャッシュしておいたメタデータを復元

キャッシュするにはNSMutableDictionaryなどを利用するとよいでしょうし、DBMetadataはNSCoding準拠なのでファイルに保存して復元するのも簡単にできます。

実際にはメタデータはJSON形式の単一のストリームで返されており、DropboxSDKがそれをDBMetadataオブジェクトに変換しています。そのため、ディレクトリ内に大量のファイルがあるときには毎回loadMetdata:を呼び出すよりも効率がよくなるでしょう。

ハッシュの利用 (2)

2010/10/16 追記 ファイルの更新については次の記事のようにrevisionでのチェックにしたほうがよいでしょう。

loadFile:intoPath:などでダウンロードしたファイルはキャッシュしておき、親ディレクトリのハッシュ値が変わったら破棄するようにします。こちらは手順が多少複雑になります。

  1. loadMetdata:withHash:を呼ぶ
    • restClient:loadedMetadata:が呼ばれたとき (ファイルが変更された可能性があるので) loadFile:intoPath: でファイルを取得 (してキャッシュしておく)
    • restClient:metadataUnchangedAtPath:が呼ばれたときはキャッシュしておいたファイルを利用

まとめ

DropboxSDKの使用時の注意点やハッシュの利用について述べました。

おまけ: icon一覧

DBMetadataのiconで返される値とその拡張子 (やフォルダ) の一覧です。全てであるとは限りません。

iconの文字列パスもしくは拡張子
folder下記以外のフォルダ
folder_star/GoodReader
folder_photos/Photos
folder_public/Public
page_white下記以外の拡張子
page_white_cc
page_white_codehtm, html
page_white_phpphp
page_white_acrobatpdf
page_white_powerpointppt, pptx
page_white_excelxls, xlsx
page_white_gearexe
page_white_texttxt, rtf
page_white_compressedzip, bz2
page_white_picturepng, jpg, gif, tiff
page_white_soundaiff, m4a, mp3, wav
page_white_filmm4v, mov, mp4
page_white_worddoc, dock
page_whitenumbers, pages, key

おまけ: Dropboxが表示に対応しているファイル形式 (2010.9時点)

形式拡張子
画像jpg, tiff, gif
音源mp3, aiff, m4a, wav
動画mov, mp4, m4v
Officedoc, docx, ppt, pptx, xls, xlsx
PDFpdf
iWorkkey, pages, numbers
HTMLhtm, html
テキストtxt, rtf

関連記事・リンク

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。