由于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。
答案 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) ;
}