2014-12-16 4 views
1

Я пишу пользовательский делегат, который прослушивает изменения аудиофайлов микрофона и его длину. Основной контроллер формирует звуковую волну при изменении данных в методе делегата. В результате данные микрофона и длина изменяются в 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 не обновляется вообще. Я давно задаюсь вопросом, где проблема. Может кто-нибудь дать мне совет?

Спасибо.

ответ

2
SXMainController *mainController = [[SXMainController alloc] init]; 
self.delegate = mainController; 
[self.delegate detectAlgorihtm:self outputBufferValue:micBuffer withBufferSize:bufferSize]; 

Этот код создает новый viewController каждый раз, когда вы получаете аудиоданные, что, скорее всего, не то, чего вы пытаетесь достичь.

То, что вы, вероятно, хотите сделать, это установить ViewController в качестве делегата после создания вашего объекта обнаружения, так:

-(id)initWithCoder:(NSCoder *)aDecoder{ 

if(self = [super initWithCoder:aDecoder]) { 
    self.detectAlgorithm = [[SXDetectAlgorithm alloc] init]; 
    self.detectAlgorithm = self; 
} 
return self; 
} 

И просто позвоните

self.delegate detectAlgorihtm:self outputBufferValue:micBuffer withBufferSize:bufferSize]; 

от другого объекта

2

Вызывается класс вызова делегата, но он не установлен в том месте, где появляется метод делегата.

-(id)initWithCoder:(NSCoder *)aDecoder{ 

    if(self = [super initWithCoder:aDecoder]) { 
     self.detectAlgorithm = [[SXDetectAlgorithm alloc] init]; 
     [self.detectAlgorithm setDelegate:self]; 
    } 
    return self; 
} 

и

// Back to the main thread to respond delegate 
dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.delegate detectAlgorihtm:self outputBufferValue:micBuffer withBufferSize:bufferSize]; 
}); 
2

Если у вас есть необходимые данные для отображения, и до сих пор ее не получает отображаться, то это означает, что каким-то образом ваша область дисплея становится реинициализирован каким-то образом, из-за которой данные попадают сбросить и ничего не показывать.

Смежные вопросы