EvernoteSDK でノートブックのリストを取得してみると、ノートブックの並びがバラバラ。
どうやら更新順に並んでいるようです。
アプリなどでノートブックのリストを表示させる場合、
ノートブック名で昇順に並んでいる必要があります。
しかも、スタックにまとめられている場合は、
スタック名がノートブック名に優先して並べられねばなりません。
この並び順を得るためのソートを行なってみました。
ポイントはソートキーをスタックとノートブック名の連結文字列にしたこと。
これによって、ソートを1回で済ませることができます。
まだ荒い部分はありますが、とりあえず並び順は公式クライアントと一致しているはず。
「これおかしい」とか、「ここもっとこう…」とかありましたら、
コメントでもTwitterでも連絡下さると嬉しいです。
// セッション
EvernoteSession* sesssion = [EvernoteSession sharedSession];
// 認証トークン
NSString* authToken = [session authenticationToken];
// ノートストア
EDAMNoteStoreClient* nStore = [session noteStore];
// 配列にノートブックのリストを格納(この段階ではバラバラ)
NSArray* notebooks = [[NSArray alloc] initWithArray:[nStore listNotebooks:authToken]];
// ソート用キーを格納するソート用配列
NSMutableArray* keys = [[NSMutableArray alloc] init];
// ソート用キーをキーにしてノートブックを格納するハッシュ配列
NSMutableDictionary* mdNotebooks = [[NSMutableDictionary alloc] init];
// ノートブックのリストからノートブックを1つずつ取り出し
for ( EDAMNotebook* notebook in notebooks ) {
// スタック
NSString* stack = notebook.stack;
// スタックが無ければ、空文字列を格納
if ( stack == nil ){ stack = @""; }
// ソート用キーを生成(ここが肝!スタックとノートブック名を連結した文字列をキーにする
NSString* sortKey = [[NSString alloc] initWithFormat:@"%@%@", stack, notebook.name];
// ソート用配列にソート用キーを格納
[keys addObject:sortKey];
// ソート用キーをキーにしてノートブックをハッシュ配列に格納
[mdNotebooks setObject:notebook forKey:sortKey];
}
// ソート後のキーを格納するソート後キー配列
NSArray* sortedKeys = [[NSArray alloc] init];
// ソート用キーをソート
sortedKeys = [(NSArray*)keys sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
// ソート後のノートブックを格納する配列
NSMutableArray* sortedNotebooks = [[NSMutableArray alloc] init];
// ソート後キー配列からキーを順次取り出し
for ( NSString* key in sortedKeys ) {
// ノートブックのハッシュ配列からキーを使ってノートブックを取り出し、ソート後ノートブック用配列に格納
[sortedNotebooks addObject:[mdNotebooks objectForKey:key]];
}
// 中身確認。
for ( EDAMNotebook* notebook in sortedNotebooks ) {
NSLog(@"%@", notebook.name);
}