Amazon Campaign

2012年10月20日土曜日

UIActivityIndicatorView の実装まとめ

iPhoneアプリにおける定番のインジケーター、いわゆる「考え中」アイコンを実装するにあたり、いくつかポイントがあったのでまとめておきます。

UIKitにインジケーターを表現する"UIActivityIndicatorView"があるので、「このViewを表示してあげるだけでいーのね」と思ったら、とんでもない。以下を考慮した実装が必要です。

  • Viewの実装
  • 別スレッドで処理
  • コールバック
  • リリースタイミング

Viewの実装

まずは UIActivityIndicatorView を生成します。これは当然ですね。

UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
[indicator setCenter:CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2)];

別スレッドで処理

インジケーターを表示したいってことは、当何らかの処理をさせたい訳なんですが、同一スレッド上で
インジケーター生成 → インジケーターViewを追加 → やりたい処理 → インジケーターView削除
ではダメなんです。
インジケーターViewを追加した状態でViewControllerの処理をいったん抜けて、端末上で描画処理まで進めてあげなければいけません。だから別スレッドで「やりたい処理」を実行させないとダメなんです。
そこで、メソッド"performSelectorInBackground"で別スレッドを立てて、引数のselectorで「やりたい処理」を呼び出してあげます。

// インジケーターView追加
[self.navigationController.view addSubview:self.indicator];

// インジケーター再生
[self.indicator startAnimating];

// 別スレッドで処理
[self performSelectorInBackground:@selector(othreProcess) withObject:nil];
[self.window makeKeyAndVisible];


コールバック

続いて、別スレッドでの「やりたい処理」が終わったら、メインスレッドへ処理が終わった旨を通知(コールバック)し、インジケーターの表示を止めてあげます。ここでは"hideIndicator"というメソッドを呼び出しています。
また、別スレッドを立てる場合は新たなスレッドでのautoreleaseを格納する"NSAutoreleasePool"を宣言してあげる必要があるようです。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

//
//  ここでやりたい処理を実行。
//

[pool release];
 
// 終了処理をメインスレッドへ通知
[self performSelectorOnMainThread:@selector(hideIndicator) withObject:nil waitUntilDone:NO];
-(void)hideIndicator {
 [self.indicator removeFromSuperview];
 [self.indicator stopAnimating];
}


リリースタイミング

最後に、別スレッドで実行した「やりたい処理」で、何らかのインスタンスを生成する場合、慣習的に "autorelease" を明示していると、先ほどの"NSAutoreleasePool"のreleaseメソッドを呼んだタイミングで開放されてしまいます。
ですので、autorelease とせずに、適切なタイミングを考慮して "release" を呼んであげる必要があります。

なんかインジケーターってよく見るので、もっと簡単、簡潔に実装できるもんだと思っていましたが、結構手間ですね。UIKit ってやつは。。。

2012年10月13日土曜日

TX-8050 で任意のネットラジオ局を登録してみる

もっぱらFMラジオとして使っている TX-8050 ですが、たまにはネットレシーバーっぽい使い方をしてみようと、任意のインターネットラジオ局を登録してみました。
登録方法としては3つ用意されています。
  1. リモコンを駆使して登録
  2. ローカルネットワークから TX-8050 へアクセスして登録
  3. vTuner というクラウドサービスを使ってクラウド上で登録
写真の付属リモコンには文字キーはなく、本体の小さなディスプレイ上でカーソルキーを使って文字を選択することになり面倒なので、今回は 2. でやってみます。


まず、登録する好みの局を探します。80年代ののRock&Pops を聞きたいので iTunes を使って探しました。iTunes上で選曲後にタイトルバーのプロパティを見るとビットレートとURLを確認することができます。ビットレートは当然高い方がいいので、今回は「BEST80 POP&ROCK」(128kbps)を選びました。


ローカルネットワークで TX-8050 にアクセスするため、IPアドレスを確認します。リモコンの[セットアップ]ボタンを押して、メニューから「5. NetworkSetup」を選択後、「IP Address」で確認できます。
ブラウザでアクセスすると以下のような画面が表示されます。


「My Favorites」で登録した局が本体から選局できるようになります。入力後「Save」ボタンを忘れずに押しましょう。


本体の「My Favorites」を表示させてみると・・・選局できました!


128kbps のソースはだいぶ良い音に聴こえます。TX-8050 は機能が豊富な割には安価なので、あまり音質には期待していませんでしたが期待以上に再生してくれます。
また、ネットラジオやファイルサーバー上の音楽ファイルなど、高品位なデジタルソースを簡単に再生できるため、ソースの質が上がったことにより、より高音質になっているように感じます。

Amazon_ad