0

このコードを実行すると、問題なく実行されますが、再度実行すると、実行されるまでに約 10 秒ほどかかり、それも時々途切れます。

編集:コードが実行されている場所をよりよく理解するために、以下にさらにコードを追加しました。この場合のメイン スレッドは、実際の Siri UI になります。これは、ジェイルブレイクされたデバイスで実行されているコードです。英語がよくわからない両親のために、ヒンディー語で 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;
}
4

1 に答える 1

0

どのようにコードを呼び出していますか? iOS で「開始に n 秒かかる」と表示される場合は、メイン スレッドの問題に対処していることがよくあります。

すべての UI 作業はメイン スレッド上で行う必要があり、すべての「高価な」非 UI 作業はメイン スレッド上で行うことはできません。これは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

    });
});
于 2015-04-20T00:29:49.813 に答える