[iOS] [Objective-C] UIをワーカースレッドから操作する

はい。突然ですがエラーが出ました。

Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now…

うんうんなるほど。。日本語でおk。

結論から言うとUIKitはスレッドセーフではないからです。
ゆえに、メインスレッド以外からUIを操作しようとするとこんなエラーが吐かれるんですね。

ではどうするか。
そんな迷える子羊iOSエンジニアのために
‘performSelectorOnMainThread’というメソッドが用意されています。
これはJava(Android)でいうところのhandlerのようなものですね。

実行例としてはこんな感じです。

[self performSelectorOnMainThread:@selector(実行したいメソッド) withObject:nil waitUntilDone:TRUE];

[iOS] [Objective-C] UICollectionViewで表示されているCellを取得する

UICollectionViewで画面に表示されているCellの一覧を取得する方法。

NSArray *cells = [self.collectionView visibleCells];

例えば、CollectionViewにCellがひとつしか表示されない
スライドショー的な物を作って、それを処理したい時はこうする。

NSArray *cells = [self.collectionView visibleCells];
if(cells.count > 0) {
  UICollectionViewCell *cell = [cells firstObject];
  // 例: cellに設定したUIImageViewにタグを設定すると簡単に取得できる
  UIImageView *imageView = (UIImageView *)[cell viewWithTag:1];

  // あとは好きにごにょごにょする
}

[iOS] [Objective-C] GPUImageでトーンカーブフィルタをかける

画像にフィルタをかけるライブラリの筆頭といえばGPUImage。
組み込みで用意されている以外のフィルタをかけたい時によく使われるのが
トーンカーブという色調補正を行うフィルタです。
事前にPhotoshop等でトーンカーブを作成し、Xcodeに放り込みます。
あとは任意のタイミングで下記のコードを実行すればお好きなトーンカーブをかけられるのです。
※ 下記の例ではトーンカーブのファイル名を[hoge.acv]としています。

// imageはUIImage
GPUImagePicture *imagePicture = [[GPUImagePicture alloc] initWithImage:image];
// hogeはPhotoshop等で作成したトーンカーブファイル「hoge.acv」
GPUImageToneCurveFilter *filter = [[GPUImageToneCurveFilter alloc] initWithACV: @"hoge"]; // トーンカーブのファイル名
[imagePicture addTarget:filter];
// viewはGPUImageView
[filter addTarget: view];
[imagePicture processImage];