Я пишу пользовательский делегат, который прослушивает изменения аудиофайлов микрофона и его длину. Основной контроллер формирует звуковую волну при изменении данных в методе делегата. В результате данные микрофона и длина изменяются в mainController, но график не отображается.Пользовательский делегат не обновляет пользовательский интерфейс в iOS
Декларация делегата в .h:
@class SXDetectAlgorithm;
@protocol SXDetectAlgorithmDelegate <NSObject>
- (void)detectAlgorihtm:(SXDetectAlgorithm *)detectAlgorihtm outputBufferValue:(float *)micBuffer withBufferSize:(UInt32)bufferSize;
@end
@interface SXDetectAlgorithm : NSObject <EZMicrophoneDelegate>
@property (nonatomic, weak) id<SXDetectAlgorithmDelegate> delegate;
@end
Реализация делегата в .m:
// Use third party API to get microphone data
-(void) microphone:(EZMicrophone *)microphone
hasAudioReceived:(float **)buffer
withBufferSize:(UInt32)bufferSize
withNumberOfChannels:(UInt32)numberOfChannels {
// Process the microphone data and then feed to "micBuffer"
...
...
...
// Back to the main thread to respond delegate
dispatch_async(dispatch_get_main_queue(), ^{
SXMainController *mainController = [[SXMainController alloc] init];
self.delegate = mainController;
[self.delegate detectAlgorihtm:self outputBufferValue:micBuffer withBufferSize:bufferSize];
});
Объявите делегат в mainController.h:
@interface SXMainController() <SXDetectAlgorithmDelegate>
@property (nonatomic, strong) SXDetectAlgorithm *detectAlgorithm;
@end
Использование Делегат для построения волны в mainController.m:
-(id)initWithCoder:(NSCoder *)aDecoder{
if(self = [super initWithCoder:aDecoder]) {
self.detectAlgorithm = [[SXDetectAlgorithm alloc] init];
}
return self;
}
- (void)detectAlgorihtm:(SXDetectAlgorithm *)detectAlgorihtm
outputBufferValue:(float *)lpfout
withBufferSize:(UInt32)bufferSize {
dispatch_async(dispatch_get_main_queue(), ^{
// Plot method...
// Use a button to test if it can display
UIButton *testButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
testButton.backgroundColor = [UIColor redColor];
[self.view addSubview:testButton];
});
}
Моя проблема, даже если я вернусь в основной поток, чтобы нарисовать волну или отобразить кнопку, пользовательский интерфейс mianController не обновляется вообще. Я давно задаюсь вопросом, где проблема. Может кто-нибудь дать мне совет?
Спасибо.