AVAudioplayer和块

时间:2014-03-27 13:55:12

标签: ios objective-c objective-c-blocks avaudioplayer

由于Apple鼓励使用块,我想做一系列动画,声音输出介于它们之间,这基本上就像一个todolist,我想用块来实现它。

不幸的是,AVAudiosplayer似乎不像UIAnimation那样支持onCompletion块。

所以我认为将这种支持添加到AVAudioplayer会很酷。

所以我不喜欢这个

#import <AVFoundation/AVFoundation.h>

@interface AVAudioPlayer (AVAudioPlayer_blockSupport)

typedef void(^AVPlaybackCompleteBlock)(void);

@property (nonatomic, copy) AVPlaybackCompleteBlock block;

-(id)initWithContentsOfURL:(NSURL*)pathURL error:(NSError**)error onCompletion:(AVPlaybackCompleteBlock) block;
-(void)setBlock:(AVPlaybackCompleteBlock)block;
-(AVPlaybackCompleteBlock)block;
-(void) executeBlock;

@end

和m文件

#import "AVAudioPlayer+blocks.h"

@implementation AVAudioPlayer (AVAudioPlayer_blockSupport)

-(id)initWithContentsOfURL:(NSURL *)pathURL error:(NSError **)error onCompletion:(AVPlaybackCompleteBlock )block {
    self = [[AVAudioPlayer alloc] initWithContentsOfURL:pathURL error:error];
    self.block = block;
    return self;
}

-(void)setBlock:(AVPlaybackCompleteBlock)block {
    self.block = block;
}
-(AVPlaybackCompleteBlock)block {
    return self.block;
}

-(void) executeBlock {
    if (self.block != NULL) {
        self.block();
    }
}

@end

这样做之后,我想我应该能够创建一个像这样的新音频播放器:

player = [[AVAudioPlayer alloc] initWithContentsOfURL:pathURL error:&error onCompletion:block];

这似乎有效。

现在在委托中将尝试执行附加的块。

if (localPlayer.block) {
    [localPlayer executeBlock];
}

不幸的是,当我尝试运行代码时,它似乎无限循环。我想使用合成,但这不适用于类别......

如果我没有实现那个方法我坚持使用'-[AVAudioPlayer setBlock:]: unrecognized selector sent to instance这是有道理的,因为没有具有该名称的方法。

我发现这个Block references as instance vars in Objective-C所以我认为我应该能够将附加属性(我的Block)附加到AudioPlayer。

1 个答案:

答案 0 :(得分:0)

我想通了,我需要使用

objc_setAssociatedObject(self, &defaultHashKey, blocked, OBJC_ASSOCIATION_COPY_NONATOMIC);

存储和访问该属性。也许这就是jere的意思,我自己也在关注内存管理。

-(void)setBlock:(AVPlaybackCompleteBlock)blocked {
    objc_setAssociatedObject(self, &defaultHashKey, blocked, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

-(AVPlaybackCompleteBlock)block {
    return objc_getAssociatedObject(self, &defaultHashKey) ;
}