如何在核心数据中存储audioPlayer实例的引用?

时间:2012-11-07 22:29:14

标签: ios core-data categories nsmanagedobject

我的目标是以这种方式将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初始化为一个gridView。结构是:

gridView - > detailView - > soundButton

按钮向gridView发送通知,其中AVAudioPlayer已实例化。当我回到detailView时,我必须显示声音是否仍在播放,且播放时间必须显示在progressBar上。我有所有使用NSMutableDisctionary但现在切换到核心数据模型因为我必须使用默认声音集预填充数据库。

因此我认为这是在声音记录中播放对AVAudioPlayer的引用的最佳方法。因为当我回到detailView时需要audioPlayer的引用。我必须知道它是否还在播放和播放时间。

你会如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

不应将AVAudioPlayer添加到核心数据中的持久存储中,因为它不符合NSCoding协议。

我要做的是从模型中删除AVAudioPlayer,但将其保存在NSManagedObject中。然后在实现中将@dynamic切换为@synthesized为audioPlayer。 (也添加一行以释放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和持续时间类似的东西,让它们直接从audioPlayer中删除,不要将它们存储在持久存储中,除非你需要它们持久存在。

修改

听起来你的问题是你在你的对象中引用avaudioplayer(为了坚持)然后保存上下文然后当你回来时你从持久性商店重新请求对象,这将不起作用,因为你的持久存储无法处理avaudioplayer。有多种方法可以解决这个问题。

第一个是将所有avaudioplayers存储在一个nsmutabledictionary中(我会将它设置为静态或单个)。这个nsmutabledictionary将由唯一标识符键入。您可以创建唯一标识符并将其存储在持久存储中(在对象上使用新属性),或者只使用声音对象的objectid(我相信)。在那一点上做我之前说过的关于在你的托管对象类中创建audioPlayer而不是创建它只是从nsmutabledictionary获取它与唯一标识符,如果没有,这意味着你需要创建一个新的音频播放器并将其添加到nsmutabledictionary。

我希望我能理解你的问题,我认为这是最简单的解决方案,也是最优雅的解决方案。另一个非常简单的就是你将正在播放的所有声音管理对象保存在内存中,就像你不需要从持久性存储中重新请求它们一样,因此你的audioplayer仍然可以访问。

有很多方法可以做到这一点,我只是给你2个我会使用的,并且不要忘记发布你的音频播放器并在完成它们时将它们从可变字典中删除。