ASIHTTPRequestで非同期通信する

NSURLConnectionを使うと非同期通信の処理は書けるのですが,結構記述するのは面倒です.NSURLConnectionを使った非同期通信については旧blogで書いているので,そちらで書きたい方は下記のエントリーを参照ください.

http://d.hatena.ne.jp/touka_tt/20120712/1342031185

今回はASIHTTPRequestというライブラリを使います.

“ASIHTTPRequestで非同期通信する” の続きを読む

新・画像を生成する関数

いつぞや、画像を生成する関数として次のようなコードを書いたのですが、

お恥ずかしながら間違っておりまして、どこが間違っているかというと

dataはmallocで動的に確保したメモリなので、解放しなきゃだめなんですが、これreturnで返しているUIImageオブジェクトの実体になるのでfreeで解放したら駄目です。せっかく作った画像を使わず解放することになってしまいます。
じゃあ、どこで解放するんだよとなるのですが、解放するための関数を用意する必要があります。CGDataProviderCreateWithData() の第4引数に解放時のコールバックを指定できるので、ここで解放する感じ。これを踏まえて正しい画像を生成する処理を書いてみます。

これでメモリリークを心配せずに処理をぶん回せるはずです!間違っててすいませんでした!

2012/11/05ソースコード訂正しました

画面の輝度を弄る

以前はGSEventSetBacklightLevel(float level)をはじめとした非公開APIを使わないといけなかった輝度周りですが、iOS5からUIScreenのフィールドにbrightnessプロパティが追加されて、簡単にいじれるようになっていました。普通に知らなかったので備忘録としてメモしておく。
「非公開APIだからリジェクトされるしなー」とか思っていたのですが、どんどん時代の波において行かれてる。

画面の明るさを取得したければ

で取得できますし、明るさを変更したければ

でできます。
値は0.0~1.0で指定しよう。

NSURLConnectionにおいてタイムアウトは無視される(こともある)

久々にiOSプログラミングの記事書くよ。

POSTを使ってデータを同期通信で送信するには

みたいなことをを書けばいいというのは以前書いたのだけど、ここで、タイムアウトを設定するには
– setTimeoutInterval:
関数を使えばいいと思うよね。ところがどっこい。ここにとんでもない落とし穴が。

これで動かしてみると、コンソールにはこう表示される。

つまりどういうことかというと、設定したタイムアウトは無視され強制的に240秒になります。どうもバグでなく仕様のようです。正直理解しがたい仕様です。
無視される条件には2つあります。

  • POSTメソッドを使っていること
  • BODYに値を設定していること

この2つの条件を満たし、BODYに値を設定した瞬間にタイムアウトは無視。

じゃ、どうすればいいかというと、まずGETメソッドを使うというのがある。しかし、セキュリティが保てないのよね。ということで、NSTimerを使って自分でタイムアウト処理を記述してしまおうというのがこのエントリの主題。

アプローチは2つあって、1つはNSThreadを使って別スレッドで同期通信の処理行い、メインスレッドの方でNSTimerを使って時間のカウントを行って時間が経過したら通信処理スレッドを終了してしまうという方法。もう一つは非同期通信を使って通信を行うようにして、NSTimerで時間をカウントして、時間経過で非同期通信を止めてしまうという方法。
何となく、後者の方がシンプルな気がしたので、後者を採用。

まず通信開始部分

ひとまずこんな感じ、ここだとタイムアウトを15秒で設定しています。
併せてタイムアウト時の処理も

あとは、非同期通信なのでNSURLConnectionのdelegateを実装すれば実装は終わりです。
正常に通信が完了した際(-(void)connectionDidFinishLoading:(NSURLConnection *)connection関数コール時)にも

を忘れないように。
こんな感じでNSTimerで簡単なタイムアウト処理を書けました。
タイムアウト無視の変な仕様が無ければこんな面倒臭いことしなくてもよかったんですがねぇ・・・

あ、急いでコード書いたのでろくにデバッグしてません、多分リークがあります。