0

私の目標は、後でそのエントリのプロパティを使用できるように、audioPlayer インスタンスの参照をコア データに格納することです。このような:

-(void)didTapButton
{
    if (!self.sound.audioPlayer.playing)
    {
        [[NSNotificationCenter defaultCenter] postNotificationName:@"playSound" object:self.sound];
        self.soundProgress.hidden = NO;
    } else {
        [[NSNotificationCenter defaultCenter] postNotificationName:@"stopSound" object:self.sound];
        self.soundProgress.hidden = YES;
    }
}

私のMOSはこんな感じです。

@interface MCSound : NSManagedObject

@property (nonatomic, retain) AVAudioPlayer *audioPlayer;
@property (nonatomic, retain) NSString * category;
@property (nonatomic, retain) NSString * duration;
@property (nonatomic, retain) NSString * fileURL;
@property (nonatomic, retain) NSString * id;
@property (nonatomic, retain) NSNumber * isLooping;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * theme;
@property (nonatomic, retain) MCTheme *ofTheme;

@end

それはこれまでのところうまくいきます。しかし、MOS を再度生成すると、AVAudioPlayer クラスは ID に置き換えられます。カテゴリでそれを行う方法はありますか? カテゴリの後にサウンド インスタンスのカテゴリを使用する必要がありますか?

編集

ビューを頻繁に切り替えているため、アプリの実行中に AVAudioPlayer への参照が必要であり、AVAudioPlayer は 1 つの gridView で初期化されます。構造は次のとおりです。

gridView -> detailView -> サウンドボタン

ボタンは、AVAudioPlayer が開始された gridView に通知を送信します。detailView に戻ったら、サウンドがまだ再生中であるかどうかを表示する必要があり、playingTime をプログレスバーに表示する必要があります。私はすべてNSMutableDisctionaryを使用していましたが、コアデータモデルに切り替えると、データベースにデフォルトのサウンドセットを事前に入力する必要があります。

したがって、サウンド レコードで AVAudioPlayer への参照を配置するのが最善の方法だと思いました。detailView に戻ったときに audioPlayer の参照が必要だからです。まだ再生中かどうかと、playingTime を知る必要があります。

どのように解決しますか?

4

1 に答える 1

1

AVAudioPlayer は、NSCoding プロトコルに準拠していないため、core-data の永続ストアに追加しないでください。

モデルから AVAudioPlayer を削除しますが、NSManagedObject に保持します。次に、実装で、audioPlayer の @dynamic を @syntheized に切り替えます。(Dealloc でオーディオ プレーヤーを解放する行も追加します)。

次に、このようなことをします

-(AVAudioPlayer*)audioPlayer {
if (self.audioPlayer) return audioPlayer;
else {
NSError * error = nil;
AVAudioPlayer * lAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:self.fileURL error:&error];

if (!error) {
self.audioPlayer = lAudioPlayer;
[lAudioPlayer release];
} else {
[lAudioPlayer release];
NSLog(@"%@",error);
}

}

}

また、isLooping と duration に似たものをお勧めし、それらを audioPlayer から直接取得し、永続化する必要がない限り永続ストアに保存しないようにします。

編集

あなたの問題は、オブジェクトでavaudioplayerを参照して(永続化のために)コンテキストを保存し、後で戻ってきたときに永続ストアからオブジェクトを再要求していることです。永続ストアが処理できないため、これは機能しませんAVオーディオプレーヤー。この問題を解決するには、複数の方法があります。

1 つ目は、すべての avaudioplayers を nsmutabledictionary に格納することです (静的またはシングルトンにします)。この nsmutabledictionary は、一意の識別子によってキー付けされます。一意の識別子を作成して永続ストアに保存するか (オブジェクトに新しい属性を付けて)、サウンド オブジェクトの objectid を使用することができます (私は信じています)。その時点で、マネージド オブジェクト クラスで audioPlayer を作成することについて前に述べたことを実行しますが、そこで作成する代わりに、作成された一意の識別子を使用して nsmutabledictionary から取得します。何もない場合は、新しいものを作成する必要があることを意味しますオーディオ プレーヤーを作成し、nsmutabledictionary に追加します。

私はあなたの問題を理解していることを願っています.これが最も簡単な解決策であり、最もエレガントだと思います. もう 1 つの非常に簡単な方法は、再生中のすべてのサウンド管理対象オブジェクトをメモリに保持することです。たとえば、永続ストアからそれらを再要求する必要がないため、オーディオ プレーヤーに引き続きアクセスできます。

これを行う方法は実に 1000 通りあります。私が使用する 2 つだけを紹介します。使い終わったら、オーディオ プレーヤーを解放し、変更可能な辞書から削除することを忘れないでください。

于 2012-11-08T01:21:35.383 に答える