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; }
こんな感じで、完成。