Как ждать, пока iSpeech закончит говорить, прежде чем пропустить следующую строку
Я использую iSpeech API. Я писал на их форумах, но там не так много активности. Я могу передать ему строку и заставить приложение произнести это. Но теперь я хочу передать массив строк, скажем, 5. Я хочу, чтобы движок говорил эти строки одну за другой, но он говорит только первую. Я решил использовать NSOperationQueue, поэтому в моем viewDidLoad я сделал:
//Create Queue
queue = [[NSOperationQueue alloc] init];
[queue setMaxConcurrentOperationCount:1];
А потом я делаю это:
(void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath {
//Set loop for 5 strings [self fetchStringsToSpeak:indexPath];
}
- (Недействительными) fetchStringsToSpeak: (NSIndexPath *) indexPath {
int stringsToSpeak = 5; for (int counter = 0; counter < stringsToSpeak; counter++) { //Get the string NSDictionary *currentString = [self.stringsArray objectAtIndex:indexPath.row+counter]; //3. Fill im text and image for cell NSString *string = [currentString objectForKey:@"text"]; //Clean the string from URLs NSError *error; NSDataDetector *linkDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:&error]; NSArray *matches = [linkDetector matchesInString:string options:0 range:NSMakeRange(0, [string length])]; NSLog(@"matches %@", matches); if ([matches count] > 0) { for (NSTextCheckingResult *match in matches) { if ([match resultType] == NSTextCheckingTypeLink) { NSString *linkToRemove = [[match URL] absoluteString]; self.cleanString = [string stringByReplacingOccurrencesOfString:linkToRemove withString:@""]; NSLog(@"Clean string: %@", self.cleanString); } } } else { NSLog(@"NO LINK"); self.cleanString = string; } //END IF/ELSE NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(speakAString:) object:self.cleanString]; [queue addOperation:operation]; //Message back to the main thread [self performSelectorOnMainThread:@selector(taDah) withObject:nil waitUntilDone:YES]; } //END FOR LOOP
}
- (void) speakAString: (NSString *) stringToSpeak {ISSpeechSynthesis * синтез = = [[ISSpeechSynthesis alloc] initWithText:stringToSpeak]; NSError *err; if(![обобщения говорят:&err]) { NSLog(@"ОШИБКА: %@", err); } self.cleanString = nil; }
Передаются значения этими методами:
Это говорит первым, но потом я получаю это:
Domain = com.ispeech.ispeechsdk.ErrorDomain Code = 303 "SDK уже выполняет синтез или распознавание. Подождите, пока он не завершится, прежде чем запускать другой запрос." UserInfo=0xb54f2b0 {NSLocalizedDescription= SDK уже выполняет синтез или распознавание. Подождите, пока это не закончится, прежде чем начинать другой запрос.}
Почему очередь операций не ждет?