2012-06-05 3 views
2

Я внедрил 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]; 

    }); 
+0

Это было время, так как ручное управление памятью, но я не подумайте, что вы должны выпустить предупреждение так быстро. Попробуйте автореализовать его. Также обязательно сделайте это на основной теме. Все изменения пользовательского интерфейса должны быть сделаны там. – borrrden

ответ

1

Изменения alertWithTTsTo

UIAlertView *inboxRead = [[[UIAlertView alloc] initWithTitle:@"Inbox tts..." 
                message:nil 
                delegate:self 
              cancelButtonTitle:@"Abbrechen" 
              otherButtonTitles:nil] autoRelease]; 
inboxRead.tag = 997; 

[inboxRead show]; 

DonT Также забудьте вызвать функцию alertWhileTTS от основного потока пользовательского интерфейса Поступая

dispatch_async(dispatch_get_main_queue(), ^{ 
     //Update UI if you have to 
     [self alertWhileTTS]; 
    }); 
+0

Я добавил autorelease, как сказал Боррден, также попытался назвать это на mainthread. также пытался с вашим кодом 'dispatch_async', но теперь нет серого экрана. после завершения TTS появится alertView. – brush51

+0

Можете ли вы показать нам, где вы вызываете alertWhileTTS? можете ли вы поместить функцию вызова? –

+0

см. Мое сообщение, я вызываю его перед '[[self view] setNeedsDisplay];' я прокомментировал код. – brush51

1

Вы должны использовать Автоматический подсчет ссылок (ARC) Как то будет автоматически освободить все , Как заявил Боррдден, вы (предположительно) быстро освобождаете UIAlertView.

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