2015-04-19 2 views
0

Когда я запускаю этот код, он работает нормально, но когда Я запустил его снова, он занимает около 10 секунд, прежде чем он запустится, и это тоже иногда прерывается.AVSpeechSynthesizer говорит, когда запускается снова, занимает 10 или около того секунд до начала

Редактировать: Ниже я добавил больше кода, чтобы лучше понять, где выполняется код. Основной поток в этом случае будет фактический пользовательский интерфейс Siri. Это код, который выполняется на джейлбрейк-устройстве. Это позволяет мне иметь Siri ответ на языке хинди для моих родителей, которые не понимают по-английски хорошо ...

- (BOOL)handleSpeech:(NSString *)text withTokens:(NSSet *)tokens withSession:(id<APSiriSession>)session { 
    if ([tokens containsObject:@"siri"]) { 
    NSRegularExpression *queryRegex = [NSRegularExpression regularExpressionWithPattern:@"(?:.*)Siri ?(.*)" options:NSRegularExpressionCaseInsensitive error:nil]; 
    NSArray *arrayOfAllMatches = [queryRegex matchesInString:text options:0 range:NSMakeRange(0, [text length])]; 

    NSString *query = nil; 
    for (NSTextCheckingResult *match in arrayOfAllMatches) { 
     if (match.numberOfRanges > 1) { 
      query = [text substringWithRange:[match rangeAtIndex:1]]; 
     } 
    } 

    if (!query || query.length == 0) { 
     query = @""; 
    } 
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; 
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 
    [manager.requestSerializer setTimeoutInterval:8.0]; 
    manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 
    [manager GET:[NSString stringWithFormat:@"http://api.salmanburhan.com/Siri/Hindi/?input=%@", [query stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]] parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { 
     NSLog(@"JSON: %@", responseObject); 

     NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; 
     AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:string]; 
     utterance.rate = 0.1000; 
     utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"hi-IN"]; 
     AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc] init]; 
     [synthesizer speakUtterance:utterance]; 
     //[synthesizer pauseSpeakingAtBoundary:AVSpeechBoundaryWord]; 


     [session sendTextSnippet:[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding] temporary:NO scrollToTop:NO dialogPhase:@"Summary"]; 

    } failure:^(NSURLSessionDataTask *task, NSError *error) { 
     NSLog(@"Error: %@", error); 
     [session sendTextSnippet:[NSString stringWithFormat:@"An Error Occurred, Sorry.\n\n%@", error] temporary:NO scrollToTop:NO dialogPhase:@"Error"]; 
     [session sendRequestCompleted]; 
    }]; 

    return YES; 
    } 
return NO; 
} 
+0

Не использовать, попробовал это как раз сейчас. @Zero –

ответ

0

Как вы называете код? Всякий раз, когда вы видите, что «требуется n секунд для запуска» в iOS, вы часто имеете дело с проблемой основного потока.

Все работы с пользовательским интерфейсом должны быть на основном потоке, все «дорогие» не-пользовательские интерфейсы не должны быть на основном потоке. Вот фрагмент кода, который я скопировал с http://www.raywenderlich.com/31166/25-ios-app-performance-tips-tricks#mainthread - это замечательный блог, который вы должны прочитать.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    // switch to a background thread and perform your expensive operation 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // switch back to the main thread to update your UI 

    }); 
}); 
+0

Спасибо за отзыв, поэтому я поместил код, в который вы положили // переключитесь на фоновый поток ... И он сделал то же самое, он запустил один раз и снова дал мне проблемы. Я не думаю, что мне придется поместить его в основной поток, потому что он играет звук. –

+1

попробуйте поместить его, где вы переключаетесь на главную нить. –

+0

Done that, same issue ... –