ActiveIndicatorを表示させる

ウェブアクセスやファイル保存など重たい処理の場合に
ユーザに処理中であることを明確にアナウンスする必要がある。

その場合、アクティブインジケーターを利用して処理中を表示させる。
ただし、このとき。同一スレッド(メソッド内)では表示されないので、
別スレッドとしてアニメーションをスタートさせるか、
重たい処理自体を別スレッドとして切り出す必要がある。

-(void)main{
        // ウェイティングを表示
    // cell.detailTextLabel.text = @"wait";
        // ウェイティングの代わりにアクティブインジケーターを利用する
        activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
	[cell setAccessoryView:activityView];
	[activityView release];
        [activityView startAnimating];
	// セレクターの作成
	SEL selector = @selector(audioPlay:myCell:);
	// シグネチャを作成
	NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:selector];
	// invocationの作成
	NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
	[invocation setTarget:self];
	[invocation setArgument:&urlStr atIndex:2];
	[invocation setArgument:&cell atIndex:3];
	[invocation setSelector:selector];
	// スレッドで実行
	[self performSelector:@selector(performInvocation:)
			   withObject:invocation afterDelay:0.0];

}

-(void)performInvocation:(NSInvocation *)anInvocation{
	
	[anInvocation invokeWithTarget:self];

}

-(void)audioPlay:(NSString*)url myCell:(UITableViewCell *)cell{

	NSURL *myurl = [NSURL URLWithString:url];
	NSData *mydata = [NSData dataWithContentsOfURL:myurl];
	
	audioPlayer = [[AVAudioPlayer alloc] initWithData:mydata error:nil];
        // アニメーションを止める
        [activityView stopAnimating];	
        cell.detailTextLabel.text = @"play";
	[audioPlayer play];
	audioPlayer.volume=0.5;
}


こんな感じで、完成。