2016-11-25 1 views
1

웹 서버의 데이터가 필요한 앱이 있습니다. 로컬 요청에 대한 빠른 응답을 보장하기 위해 여러 국가에 서버가 있습니다. 앱을 시작할 때 어떤 서버를 사용해야할지 결정하고 싶습니다. 따라서 다른 서버에 요청을 보내고 어떤 응답을 먼저 확인해야합니다.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; 
} 

EDIT : 모든 서버가 응답하지만 전 세계의 서버는 응답 속도가 느립니다. 가장 느린 서버가 아닌 가장 빠른 서버를 설정해야합니다.

+0

url vars와 연결된 각 서버에 대한 플래그 변수를 만듭니다. – DeyaEldeen

+1

GLC를 사용하여 메인 스레드에'url'을 보내고 nil이 아니라면'serverURL'을 설정하십시오. – KudoCC

+0

@KudoCC, 좀 더 자세히 설명해 주시겠습니까? – boreas

답변

0

많은 요청을 보내고 모든 요청이 완료되면 귀하의 serverURL 값을 무시한다고 가정 해 보겠습니다. 결과적으로 최신 값을 얻게됩니다. 이를 피하기 위해 serverURL을 속성 또는 전역 변수로 만든 다음 serverURL이 할당 전에 이미 값을 갖고 있는지 확인하고 그 값이있는 경우이를 업데이트하지 마십시오.

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

실제로 첫 번째 응답을 받으면 더 이상 답변이 필요 없으므로 다른 요청을 취소 할 수 있습니다.

+0

나는 (결과 == nil ||! [결과 isEqualToString : @ "ok"]) 부분은 대체 부분 일 뿐이지 만 귀하의 대답은 정확하다고 생각합니다. – LoVo

+1

'serverURL'은 다중 쓰레드의 전역 값이므로 판단과 할당을 메인 쓰레드에 잠금 또는 디스패치하는 것과 같은 동기화 도구를 사용해야합니다. – KudoCC