2013-10-10 7 views
7

Ich denke, das ist wirklich eine Feature-Anfrage an Google, aber ich bin neugierig, ob jemand eine Arbeit kennt. Ich würde gerne eine synchrone Anfrage auf eine GAE Endpoints API ausführen.Ausführen synchrone Abfragen an Google Cloud Endpoints auf iOS

In Android ist die Ausführung einer Anfrage synchron. Dann fügen Sie es in eine AsyncTask ein, damit es im Hintergrund funktioniert.

In iOS wird eine Anfrage asynchron ausgeführt. Sie geben einfach einen Rückrufblock ein.

Ich konvertiere eine Android-App in eine iOS-App und es wäre wirklich nett, wenn sie den gleichen Mechanismus verwenden würden. Zum Beispiel gibt es Zeiten, wenn ich eine synchrone Abfrage WÜNSCHE. Es macht meinen Code einfacher und ich weiß, dass ich ihn auf einen Hintergrund-Thread setzen muss.

Also meine Frage ist dies ... gibt es eine Möglichkeit (Hacky oder nicht) zu blockieren, bis die iOS-Abfrage abgeschlossen ist?

+0

Haben Sie es jemals herausgefunden? – BlueBoy

+0

Wir haben vor Jahren einen Hacky Lock Trick für unseren Code ausgearbeitet. Es funktioniert für uns, aber es ist alles in Objective-C. Lass es mich wissen, wenn du Schnipsel brauchst. Google hat Endpoints 1.0 inzwischen veraltet und wird am 8/2/2018 heruntergefahren. Ich habe noch nicht in Endpoints 2.0 nachgeschaut (offiziell nennen sie es Cloud Endpoints Frameworks für App Engine). Info zum Herunterfahren von Endpoints 1.0: https://cloud.google.com/endpoints/docs/frameworks/legacy/v1/python/ –

Antwort

4

Sie können auf den Anruf warten, um mit Code mit einer Zeitüberschreitung zu beenden, die einen ähnlichen Code verwendet. Natürlich möchten Sie dies nicht auf einem UI-Thread tun, aber dies würde sicherstellen, dass Ihre Completion-Handler seriell ausgeführt werden.

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

Ich habe etwas Ähnliches versucht, indem ich auf eine Bedingung gewartet habe, nachdem ich den Aufruf von 'executeQuery' im Hauptprogramm ausgeführt habe Thread (ich probierte auch aus einer 'NSOperationQueue') und signalisiere die Bedingung im Completion-Handler. Dies blockiert jedoch den Hauptthread. Ist 'waitForTicket:' der einzige Weg zu gehen? Könnte es z.B. Sei das der Completion Handler immer am Haupt Thread aufgerufen? – Drux