2013-10-10 6 views
7

Я предполагаю, что это действительно запрос функций для Google, но мне любопытно, знает ли кто-нибудь об этом. Я хотел бы выполнить запрос запроса синхронного запроса в GAE Endpoints api.Выполнение синхронных запросов к облачным конечным точкам Google на iOS

В Android, выполняющем запрос, синхронно. Затем вы помещаете его в AsyncTask, чтобы заставить его работать в фоновом режиме.

В iOS выполнение запроса является асинхронным. Вы просто передаете блок обратного вызова.

Я конвертирую приложение для Android в приложение iOS, и было бы очень хорошо, если бы они использовали тот же механизм. Например, есть моменты, когда я ХОЧУ синхронный запрос. Это просто упрощает мой код, и я знаю, что он помещает его в фоновый поток.

Итак, мой вопрос в том, что ... есть ли какой-либо способ (взломать или нет) заблокировать до завершения запроса iOS?

+0

Вы когда-нибудь это выяснили? – BlueBoy

+0

Мы разработали хитроумный трюк для нашего кода несколько лет назад. Это работает для нас, но это все в Objective-C. Просто дайте мне знать, если вам нужны фрагменты. Google теперь устарел от Endpoints 1.0 и закрывает его на 8/2/2018. Еще не просмотрели Endpoints 2.0 (официально они называют это Cloud Endpoints Framework для App Engine). Информация о завершении Endpoints 1.0: https://cloud.google.com/endpoints/docs/frameworks/legacy/v1/python/ –

ответ

4

Вы можете дождаться завершения вызова с кодом с таймаутом, используя код, похожий на этот. Очевидно, что вы не захотите делать это в потоке пользовательского интерфейса, но это обеспечит запуск ваших обработчиков завершения в последовательном порядке.

NSLog(@"Before API Call"); 
GTLServiceTicket *apiCall = [apiService executeQuery:query completionHandler:^(GTLServiceTicket *ticket, 
                GTLHelloworldHelloGreeting *object, 
                NSError *error) { 
    NSLog(@"Starting completion handler"); 
    NSArray *greetings = [NSArray arrayWithObjects: object, nil]; 
    greetingsRetrievedFromAPI = greetings; 
    [self performSegueWithIdentifier: @"DisplayGreetings" sender: self]; 
    NSLog(@"Ending completion handler"); 
}]; 
[apiService waitForTicket:apiCall timeout:100000 fetchedObject:nil error:nil]; 
NSLog(@"After completion handler"); 
+0

Я попробовал что-то подобное, ожидая условия после выдачи вызова 'executeQuery' на основной thread (я также пытался использовать NSOperationQueue) и сигнализировал условие в обработчике завершения. Однако это блокирует основной поток. Является ли 'waitForTicket:' единственным способом? Может ли это, например? что обработчик завершения всегда вызывается в основном потоке? – Drux

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