2014-03-27 31 views
0

正如Apple鼓勵使用塊,我想要做一系列動畫,在它們之間有聲音輸出,這基本上像一個todolist,我想用塊來實現它。AVAudioplayer和Blocks

不幸AVAudiosplayer似乎不支持onCompletion塊,以UIAnimation的方式。

所以我認爲將這種支持添加到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 

,我想我應該能夠創造這樣一個新的audioplayer :

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所以我想我應該能夠附加屬性(我的塊)到AudioPlayer。

回答

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