Я внедрил textToSpeech в свой проект и хочу отображать предупреждение в то время, когда текст говорит. здесь я звоню методы для TextToSpeech:Как правильно использовать multithred? UIAlertView не отображается, только серый экран
//-----before TTS starts i try to display alertView with Cancelbutton
//[self performSelectorOnMainThread:@selector(alertWhileTTS) withObject:nil waitUntilDone:YES]; //gray view and no alertview
//[self performSelector:@selector(alertWhileTTS)]; //gray view and no alertview
//[self alertWhileTTS]; //gray view and no alertview
//this part here is blocking, no gray screen,
//after TTS is ready, the alertView is displayed
dispatch_async(dispatch_get_main_queue(), ^{
//Update UI if you have to
[self alertWhileTTS];
});
[[self view] setNeedsDisplay];
[self synthesizeInBackground];
[queue waitUntilAllOperationsAreFinished];
[self setIsSpeaking: false];
[[self view] setNeedsDisplay];
Здесь метод synthesizeInBackground (в методеsynthesize
запускает TTS):
- (void) synthesizeInBackground {
queue = [[NSOperationQueue alloc] init];
operation = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(synthesize) object:nil];
[queue addOperation: operation];
}
Хотя TTS я хочу, чтобы отобразить alertView с cancel
кнопка. Но в моем случае я получаю только серый экран без alertView.
Как я могу правильно вызвать alertWhileTTS, чтобы отобразилось alertView?
здесь содержание alertWhileTTS:
- (void) alertWhileTTS {
UIAlertView *inboxRead = [[[UIAlertView alloc] initWithTitle:@"Inbox tts..."
message:nil
delegate:self
cancelButtonTitle:@"Abbrechen"
otherButtonTitles:nil] autorelease];
inboxRead.tag = 997;
[inboxRead show];
}
UPDATE видеть мое решение, которое работает:
[self performSelectorOnMainThread:@selector(alertWhileTTS) withObject:nil waitUntilDone:YES];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, (unsigned long)NULL), ^(void) {
[[self view] setNeedsDisplay];
[self synthesizeInBackground];
[queue waitUntilAllOperationsAreFinished];
[self setIsSpeaking: false];
[[self view] setNeedsDisplay];
});
Это было время, так как ручное управление памятью, но я не подумайте, что вы должны выпустить предупреждение так быстро. Попробуйте автореализовать его. Также обязательно сделайте это на основной теме. Все изменения пользовательского интерфейса должны быть сделаны там. – borrrden