Objective-C Асинхронный вызов для Google Long Running Speech API не возвращает статус операции true? - PullRequest
0 голосов
/ 26 декабря 2018

Возникла проблема при использовании долгого API Google для асинхронного распознавания речи.operation.done не возвращает истину.

Я изменил образец программы Objective-C https://github.com/GoogleCloudPlatform/ios-docs-samples/blob/master/speech/Objective-C/Speech-gRPC-Nonstreaming/Speech/SpeechRecognitionService.m для использования longruning API.

Вот модифицированный фрагмент -

// prepare a single gRPC call to make the request
GRPCProtoCall *call = [client RPCToLongRunningRecognizeWithRequest:recognizeRequest
                                                            handler:
                        ^(Operation *operation, NSError *nserror) {
                            if (nserror) {
                                NSLog(@"ERROR: %@", nserror);
                                completion([nserror description]);
                            } else {
                                NSLog(@"RESPONSE name %@", operation.name);
                                while (!operation.done) {
                                    NSLog(@"operation done -  %d", operation.done);
                                    usleep(2000000);
                                }
                                    GPBAny *gpbAny = operation.response;
                                    NSLog(@"RESPONSE typeURL %@", gpbAny.typeURL);
                                    NSLog(@"RESPONSE deescription %@", gpbAny.value.description);
                                    GPBMessage *longRunningResponse = [gpbAny unpackMessageClass:LongRunningRecognizeResponse.class error:nil];
                                    NSLog(@"RESPONSE RECEIVED %@", longRunningResponse);
                                completion(longRunningResponse);
                            }
                        }];

Это никогда не приходитиз цикла while (!operation.done).operation.name вернуть правильный идентификатор операции.Я смог проверить с помощью команды gcloud ml speech operations describe 2104003022050949209, что вызов перешел на Google Speech API, и он вернул записанное сообщение.Но код объективного C не возвращает операцию.

1 Ответ

0 голосов
/ 28 декабря 2018

Я не думаю, что именно так должен работать gRPC или этот API.Для gRPC, после получения ответа (объект Operation), его значение больше не изменится, поэтому циклический цикл на нем наверняка вызовет бесконечный цикл.Метод LongRunningRecognize является асинхронным методом RPC, поэтому в этом случае operation.done == false просто означает, что эта операция все еще выполняется на стороне сервера.Вам понадобятся методы из службы Operation для дальнейшего взаимодействия с сервером для результата этого запроса.

...