2013-10-10 31 views
7

我想這確實是Google的一項功能請求,但我很好奇有沒有人知道解決方法。我想執行一個同步查詢請求到GAE端點api。對iOS上的Google Cloud端點執行同步查詢

在Android中執行請求是同步的。然後你把它放到一個AsyncTask中,讓它在後臺工作。

在iOS中執行請求是異步的。你只需傳入一個回調塊。

我正在將Android應用程序轉換爲iOS應用程序,如果他們使用相同的機制,它會非常好。例如,有些時候我想要一個同步查詢。它只是讓我的代碼更容易,我知道把它放在後臺線程上。

所以我的問題是這樣的...有沒有什麼辦法(哈克或不),直到iOS查詢完成?

+0

你有沒有想過? – BlueBoy

+0

我們在多年前爲我們的代碼制定了一個哈克鎖定技巧。它適用於我們,但它都在Objective-C中。只要讓我知道你是否需要片段。 Google現在已棄用終端1.0,並將於8/2/2018關閉它。還沒有研究過終端2.0(官方稱他們爲App Engine的Cloud Endpoints框架)。關於端點1.0關機的信息:https://cloud.google.com/endpoints/docs/frameworks/legacy/v1/python/ –

回答

4

您可以使用類似於此的代碼在呼叫中等待超時代碼。顯然你不想在UI線程上這樣做,但這會確保你的完成處理程序以串行方式運行。

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

我在main()函數發出對'executeQuery'的調用後等待一個條件,線程(我也嘗試從'NSOperationQueue')並在完成處理程序中發信號通知條件。但是,這阻止了主線程。是'waitForTicket:'唯一的路要走嗎?可以嗎,例如是完成處理程序總是在主線程上調用? – Drux