在NSObject中玩NSSound(带有Objective-C的Mac App)

时间:2017-10-31 12:33:18

标签: objective-c cocoa nsobject nssound

我正在制作一款需要播放音乐的游戏。为了使我的代码更易于管理,我想制作一个能够处理声音的NSObject(如淡入淡出,播放播放列表中的声音等)。我有这段代码:

NSSound *music = [[NSSound alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:self.filename ofType:self.fileExtention] byReference:NO];
[music play];

当我将它放在AppDelegate.m文件中时,此代码有效,但当我将它放在New NSObject类中时它不起作用。

NSObject类中的代码(名为Music):

- (void)playMusic:(NSString *)fileName ofType:(NSString *)type
{
    NSSound *music = [[NSSound alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:self.filename ofType:self.fileExtention] byReference:NO];
    [music play];

    NSLog(@"Works!");
}

我在AppDelegate.m中使用此代码调用该方法:

[[[Music alloc] init] playMusic:self.fileName ofType:self.extension];

当执行此操作时,它会记录" Works!"这意味着代码被执行。

所以完全相同的代码在AppDelegate中工作,但在NSObject类中不起作用。有没有人知道是否可以在NSObject类中播放NSSound(如果不是,为什么?),如果是这样,如何编辑代码以使其有效?它会让我的代码看起来更乱;)

1 个答案:

答案 0 :(得分:1)

在主线程上尝试调用方法,

dispatch_async(dispatch_get_main_queue(), ^{
  // do work here
});