AssetsLibraryの勉強:フォトライブラリの最新の画像を取得

「フォトライブラリの最新の画像を取得する」というボタンをiOSに設置したくて奮闘中。
とりあえず、なんとなくAssetsLibraryのことがわかってきた。

■AssetsLibrary
→本体。こいつでやることは特に無い。
AssetsGroupを取ってくるくらい。
アルバムの新規作成はできる気がしたが未検証

取り方は下記

                                                                                                                • -

// まず、グループ列挙時の関数を定義
void (^groupBlock)( ALAssetsGroup*, BOOL* ) = ^( ALAssetsGroup* group, BOOL* stop ){
if( group == nil ) { return; }
[self.groups addObject:group];
//今回はこの後でAssetsも取得するので。
[self performSelectorOnMainThread:@selector( getFirstAssets ) withObject:nil waitUntilDone:NO];
};

// エラー関数定義
void (^failureBlock)( NSError* ) = ^( NSError* error ){ NSLog( @"Group enumurate error: %@", error ); };

//アルバム情報の取得
[self.assetLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:groupBlock failureBlock:failureBlock];

                                                                                                                • -

enumerateGroupsWithTypes:usingBlock:failureBlock: のusingBlockが起動するタイミングが良くわかっていないが、
こいつが入ってるメソッドの終了時な気がする。
ので、enumerateGroupsWithTypes:... の直後にgroupを取得するような関数を書くと失敗する。


■AssetsGroup
→アルバム。この中に画像がいっぱい入ってる。
Groupの中から、Assetを取り出す。

取り方は下記

                                                                                                              • -
  • (void) getFirstAssets{

//最初のグループを取得
ALAssetsGroup *group = [self.groups objectAtIndex:0];

//Assetsを取得
[group enumerateAssetsUsingBlock:^( ALAsset *result, NSUInteger index, BOOL *stop ){
if( result == nil ) { return; }
NSString* type = [result valueForProperty:ALAssetPropertyType];
if( [type isEqualToString:ALAssetTypeVideo] ) { return; } //写真のみにする
[self.assets addObject:result];
}];
}

                                                                                                              • -

Groupsの時と同様、enumrateAssetsUsingBlock: の関数の呼び出しタイミングがよくわかっていないが、
こいつが入ってるメソッドの終了時な気がする。


■Assets
→画像(とか動画とか)のオブジェクト。
日付とかは取れるらしいが今回は特に使わなかった。今回は「こいつが画像なのか?動画なのか?を一応利用。
実際に画像データ(UIImageとか)を扱うには、assetの中からassetRepresentationを取り出す必要がある。
ちなみに、AssetsLibraryからURLを指定することでassetを直接取り出すこともできるっぽい。

assetRepresentationの取得方法は下記

                                                                                                                        • -

ALAsset* asset = [self.assets lastObject];
if( asset == nil ) { return; }
ALAssetRepresentation* rep = [asset defaultRepresentation];

                                                                                                                        • -

defaultじゃないのは何があるのか、とかそういうことはまだ不明


■AssetRepresentation
→実際のデータが詰まってる。
UIImageとかを取ってくるにはこれを使う

こんな感じ

                                                                                                                        • -

UIImage* image = [UIImage imageWithCGImage:[rep fullScreenImage] scale:[rep scale] orientation:( UIImageOrientation )[rep orientation]];
_imageView.image = image;
-------------------------------------------------------------



しかし、最後のデータを取得したいだけなのに、Library,Groups,Assets,Asset,AssetRepresentationといっぱい取得するのはなんだか無駄な気がするので、なんとかスマートに取得できないか奮闘中。

===========================

追記

いろいろ奮闘してみた。
・画面の表示時ではなく、ボタン押下時に最新の画像を取得
・Assetはすべてを取得せず、最後の一枚だけを正確に取得
また、各種enumerationメソッドは最後に result=nil のデータが来る、ということがわかったので、
callback関数を定義することもできた。

                                                                              • -

//最新の画像を取得

  • (IBAction)useBlandNewImage:(id)sender {


self.assetLibrary = [[ALAssetsLibrary alloc] init];
self.groups = [[NSMutableArray alloc] init];

//関数を先に定義
void (^failureBlock)( NSError* ) = ^( NSError* error ){ NSLog( @"Error in enumerateGroup: %@", error ); };
void (^groupBlock)( ALAssetsGroup*, BOOL* ) = ^( ALAssetsGroup* group, BOOL* stop ){
if(group){
[self.groups addObject:group];
}else{
//すべて取得し終わったら、最初のグループの最後のassetを取得
ALAssetsGroup *group = [self.groups objectAtIndex:0];
NSMutableIndexSet *indexSet = [NSMutableIndexSet new];
[indexSet addIndex:[group numberOfAssets]-1];
[group enumerateAssetsAtIndexes:indexSet options:nil usingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop) {
if(asset){
//一つしかない
ALAssetRepresentation *rep = [asset defaultRepresentation];
UIImage* image = [UIImage imageWithCGImage:[rep fullScreenImage] scale:[rep scale] orientation:( UIImageOrientation )[rep orientation]];

_imageView.image = image;
}else{
[self analizeImage];
}
}];
}
};

//画像ゲット
[self.assetLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:groupBlock failureBlock:failureBlock];

}

                                                                              • -

GoogleMapsをiOS6で使う方法

http://www.appps.jp/archives/1980203.html
↑このサイトで「見れねーよ」「頑張ってソース表示させてみたけどできなかったよ」という人向け。

ホントのURLはこちらです。


data:text/html;charset=UTF-8,GoogleMaps

多分、何かのプラグインが邪魔して、きちんとしたURLが出せなかったんだろうな〜。

ホーム画面に追加したときに光沢が気になったんだけど、下のコードではnavigatorがstandaloneにならない・・・困ったな


data:text/html;charset=UTF-8,GoogleMaps


ちょっとこれ試してみよう


data:text/html;charset=UTF-8,GoogleMaps

古本屋と図書館のコラボは?


この本↓で、
「買い置きをやめよう。君は、スーパーという、倉庫を持っているじゃないか」
みたいに書いてあった。

自由であり続けるために 20代で捨てるべき50のこと (Sanctuary books)

自由であり続けるために 20代で捨てるべき50のこと (Sanctuary books)

その派生で、古本屋と図書館の融合ができないかな?

・古本(良品)を買い取る
・それに、専用ブックカバーみたいなのをかぶせて、販売する。
(例:古本屋だと300円の本を、400円で販売)
・専用ブックカバーがついている本は、かなりの高値で買い取る
(例:さっきの本だと、300円で買い取り)

貸本屋みたいだけど、延滞、とかじゃなくて、一応売り切りの形。
CDとかにも応用できるかも。

classだって256人いればidに並べるんだ!

256個のclassで、idを上書きできるという記事を見たので、早速検証してみた。
http://www.ideaxidea.com/archives/2012/08/256classes.html
http://codepen.io/chriscoyier/pen/lzjqh

どうやら、classは256個でidと「並ぶ」ので、
その時点でCSS上で後ろにあるclass側が適用される、ってことみたい。
実際、id側を後ろにすると、id側のスタイルが適用された。

次に、class側を257個にしてみたら、今度はclass側が適用された。
http://codepen.io/kamyu1201/pen/EpCfe


どうやら、id > class、は点数制なんだろうなー。
idは256点、classは1点、みたいなのがあるんだろうなーと思った。
id > classって、嘘なんだ…。
調べると、確かに点数制ってことは確かみたいだけど、

「id=100点」「class=10点」という記事が多い…。
CSS3になってちょっと変わったんだろうか。

それぞれのセレクタが何点なのか調べてみたいな〜。

こんなゴミ箱欲しいな

ちょっと前に、自動で動くゴミ箱がニコ動かなにかに出てて、スゲー!って思ったけど…
個人的には、ゴミをゴミ箱に入れることよりも、いっぱいになったゴミ箱を処理するほうが面倒。

スーパーの袋とかを使ってるけど、手に入るのが不定期だし、
その袋をどっかに保管しておくのも面倒。


というわけで、
「袋が手に入ったときにセットしておけるゴミ箱」を考えてみたよ!

だれか作ってくんねーかな。

「自分で選ぶ」ことの重要性

ネットで見かけたこんな記事↓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
例えば、コンビニのおにぎり。

いろんな種類がありますな。

正直多すぎだろと思うでしょうな。

だからと言って売れ筋だけにしてしまうと売上は激減してしまうんですな。

つまり「沢山」の中から「自分」で「選ぶ」というのが大事なんですな。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


「どっちがいい?」
「どれがいい?」
だけを、選べるようなサイトでも作ってみようかな。

ただのアンケートサイトにならないように注意しなきゃ。