0

我需要在應用程序中進行多個異步服務調用:來自我的應用程序委託的didFinishLaunchingWithOptions:方法,以便從應用程序中的各種控制器中檢索一些服務中的某些數據。我已經控制了服務,並且我設計的API儘可能地爲RESTful,所以我需要在應用程序初始化期間進行多次調用。在iPhone應用程序初始化時進行多個服務調用

我想要做的是顯示帶有進度指示器的加載視圖 - 類似於Default.png的默認啓動畫面 - 並在服務調用完成後移除該視圖,並獲得我需要的初始值。如果只有一個服務調用,這很容易實現,因爲我可以通過隱藏加載視圖並顯示根控制器來簡單地將該邏輯掛接到NSURLConnection的connectionDidFinishLoading:delegate方法。

但是,對於多個服務調用,它變得棘手。我可以將所有內容「鏈接」在一起,發出一個請求,等待它完成/失敗,然後發出第二個請求,等等直到我接到最後一個請求。在最後的請求中,我隱藏加載視圖並顯示普通視圖。但是,這可能會在多個服務調用中變得笨拙,代碼變得難以理解和遵循。

有關最佳方法的任何建議嗎?

我在想一個解決方案是有一個singleton類負責進行服務調用和應用程序初始化。單例對象將在啓動時並行觸發所有必要的請求,並且每個失敗/完成回調將檢查每個請求是否已完成。如果所有請求都已完成,那麼它可以調用應用程序委託中的某些方法並告訴它隱藏加載視圖,顯示根控制器等。

想法?

回答

0

另一種可能性是讓每個服務完成回調通知(NSNotification)進度指示器的控制器已經取得進展。你也可以告訴控制器你有多少要求的進度指示器,並讓它保持得分,當它認爲一切都完成時,它本身會進行回調。

+0

通過這種方式,您可以一次啓動所有服務請求,而不是通過序列化來減慢速度。 – hotpaw2 2010-09-02 23:49:28

+0

謝謝。這或多或少是我採用的方法,因爲我只有幾個請求,只需要一個輕量級的解決方案。完成的每個請求都會通知主對象請求已完成,並且主對象將在加載主應用程序視圖之前檢查是否所有必需的請求都已完成。 – pmc255 2010-09-08 06:36:18

0

我正在做一些類似於NSOperationQueue的配置,該配置一次只運行1次操作。參見例如WeaveEngine.m和它的synchronizewithServer:credentials:方法。我將所有單獨的操作排隊,這些操作大多數是異步網絡調用。

0

你可以使用NSThreading,並在每個東西單獨的線程同步調用,你需要得到像

[NSThread detachNewThreadSelector:@selector(getDataRequest1:) toTarget:self withObject:urlRequest]; 
[NSThread detachNewThreadSelector:@selector(getDataRequest2:) toTarget:self withObject:urlRequest]; 
[NSThread detachNewThreadSelector:@selector(getDataRequest3:) toTarget:self withObject:urlRequest]; 

然後選擇爲每個線程做這樣的事情

- (void) getDataRequest1:(NSURLRequest*)urlRequest { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSHTTPURLResponse *urlResponse; 
    NSError *error; 
    NSData *responseData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&urlResponse error:&error]; 
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
    if ([urlResponse statusCode] < 200 || [urlResponse statusCode] > 299) { 
     //request probably failed 
    }else{ 
     [self performSelectorOnMainThread:@selector(completeRequest1:) withObject:responseData waitUntilDone:NO];   
    } 
    [pool drain]; 
    [responseString release]; 
    [urlRequest release]; 
} 
當然

它真的取決於你想要產生多少個請求/線程。 ,你將需要跟蹤你產卵的次數和完成次數,以便你可以正確地停止你的微調。

相關問題