2016-11-25 41 views
1

我有來自Web服務器要求數據的應用程序。我在不同的國家有服務器,以確保本地請求的快速響應。在應用程序開始時,我想決定使用哪個服務器,因此我的計劃是向不同的服務器發送請求並首先檢查哪些響應。iOS的多線程響應

我在每臺服務器上都有一個check.php,並返回「ok」作爲響應,我可以在不同線程中調用它,但我不知道如何將serverURL設置爲第一個響應的服務器。誰能幫忙?還是有更好的方法來實現我想要的?

NSURL *url = [NSURL URLWithString:@"http://server_de/check.php"]; 
NSError *e = nil; 
NSString* result = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&e]; 
if (result == nil || ![result isEqualToString:@"ok"]) { 
    serverURL=ServerDE; 
} 

編輯:所有服務器都會響應,但世界另一端的響應會更慢。我需要設置最快的服務器,而不是最慢的服務器。

+0

爲每個服務器一個標誌變量,與您的網址鏈接瓦爾。 – DeyaEldeen

+1

使用GCD將'url'派發到主線程,如果它不是nil則設置'serverURL'。 – KudoCC

+0

@KudoCC,你能否提供更多的細節? – boreas

回答

0

比方說,你發送請求的數目以及每個請求覆蓋,當它完成了你的serverURL價值,這就是爲什麼你得到的最新一個到底。爲了避免這種情況,你可以做serverURL作爲屬性或全局變量,然後檢查是否serverURL早已轉讓前值,如果是,那麼不更新它。

if ((result == nil || ![result isEqualToString:@"ok"]) && serverURL != nil) { 
    serverURL = aServer; 
} 

實際上,一旦您獲得第一個響應,您可以取消其他請求,因爲您不需要他們的答案了。

+0

我想(結果==零|| [導致isEqualToString:@「OK」]!)部分只是回退的一部分,但你的答案是正確的。 – LoVo

+1

'serverURL'是多線程中的全局值,因此您應該使用一些同步工具來鎖定或派發判斷和分配給主線程。 – KudoCC