【问题标题】:AVAudioplayer and BlocksAVAudioplayer 和 Blocks
【发布时间】:2014-03-27 13:55:12
【问题描述】:

由于 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];
}

不幸的是,当我尝试运行代码时,它似乎在无限循环。我想用 synthesize 代替,但那不是用于类别的......

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

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

【问题讨论】:

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


    【解决方案1】:

    我想通了,我需要使用

    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) ;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多