私は初めて使用dispatch_queue_t
し、アプリに2つの問題があり、GCDを使用して解決できると思います。1 つ目は、メイン ビュー (ViewController) に、別のクラス (AudioViewController) によって実現されるラベルがあり、ViewController でユーザー インタラクションを行うと、ラベルの実現が停止することです。dispatch_queue_t
この問題を使用すると、解決されます。
2 つ目は、コントリビューションを押すと同じメイン ビュー (ViewController) で別のクラス (ContributionViewController) を呼び出し、このクラスは常に更新される別のクラス (AudioViewController) のインスタンス変数だけにアクセスすることです。コントリビューションを開始すると、ループを作成して複数の値を取得し、それらを使用して計算を行いましたが、それらの値はすべて同じです。
ここにいくつかのコードを入れて、物事をクリアしようとします。
ViewController.m
- (IBAction)makeContribution:(id)sender
{
NSLog(@"A: Contribution button clicked");
NSLog(@"-= START CONTRIBUTION =-");
cvc = [[ContributionViewController alloc] init];
cvc.avc = self.avc;
// Get NUM_CONTRIBUTIONS contributions to make average.
int contContribution;
for (contContribution = 0; contContribution < NUM_CONTRIBUTIONS; contContribution++) {
[cvc getEachContribution];
}
// Make average
[cvc makeAverage:NUM_CONTRIBUTIONS];
[cvc release];
}
AudioViewController.m
- (void)audioInitializationWithTimeInterval:(float)time
{
NSDictionary* recorderSettings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:kAudioFormatLinearPCM],AVFormatIDKey,
[NSNumber numberWithInt:44100],AVSampleRateKey,
[NSNumber numberWithInt:1],AVNumberOfChannelsKey,
[NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,
[NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,
[NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
nil];
NSError* error;
NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];
recorder = [[AVAudioRecorder alloc] initWithURL:url settings:recorderSettings error:&error];
//enable measuring
//tell the recorder to start recording:
[recorder record];
if (recorder) {
[recorder prepareToRecord];
recorder.meteringEnabled = YES;
[recorder record];
levelTimer = [NSTimer scheduledTimerWithTimeInterval:time target:self selector:@selector(levelTimerCallback:) userInfo:nil repeats:YES];
}
else
NSLog(@"%@",[error description]);
}
- (void)levelTimerCallback:(NSTimer *)timer
{
//NSLog(@"-= AVC =-");
[recorder updateMeters];
db = [recorder averagePowerForChannel:0] - DBOFFSET;
db += 120;
db = db < 0 ? 0 : db;
vc.lab_decibel.text = [NSString stringWithFormat:@"%0.0f", db];
}
ContributionViewController.m
- (void)getEachContribution
{
actualContribution = self.avc.db;
NSLog(@"Actual contribution: %f", actualContribution);
NSLog(@"Sum before: %0.2f", sumContribution);
sumContribution += actualContribution;
NSLog(@"Sum After: %0.2f", sumContribution);
}
- (void)makeAverage:(int)numOfContributions
{
self.average = self.sumContribution / numOfContributions;
NSLog(@"Average: %0.2f", self.average);
}
それで、主なことはdispatch_queue_t
私の問題を解決することであり、それをどのように行うのですか?dispatch_queue_t
AudioViewController、ContributionViewController、および ViewControllerを配置しようとしましたが、1 つ目はラベルを更新せず、2 つ目はクラッシュし、3 つ目はラベルの値が 0 のままです。
この問題を解決するためのヒントをありがとう。
編集01:
デシベル ラベルは常に変化します。