2016-09-16 2 views
4

둘 다 HTTP GET 요청을하고 둘 다 완료 한 후에 만 ​​결과를 처리해야하는 상황이 있습니다. 각 개별 네트워크 요청에 완료 처리기가 있지만 두 요청의 데이터가 검색되는시기를 알지 못해 도움이되지 않습니다.동시에 두 개의 HTTP 네트워크 요청을해야 함 (완료 처리가 완료되면 모두 완료)

GCD에 대한 경험이 제한되어 있지만 이제 Swift 3이 출시되었습니다. 여러 작업을 실행하고 단일 완료 처리기를 사용하는 방법을 파악하려고합니다. 내 연구에 따르면 GCD 또는 NSOperationQueue가 내가 원하는 해결책 일 수 있습니다. 누구나 직업에 맞는 도구를 제안하고 Swift 3에서 코드가 어떻게 보이는지 제안 할 수 있습니까?

+0

GCD 또는 NSOperationue를 사용할 수 있습니다. GCD : 이것을 확인하십시오 [http://stackoverflow.com/questions/37805885/how-to-create-dispatch-queue-in-swift-3][1] – user6837640

답변

12

당신은 그룹을 입력 파견 그룹을 사용해야합니다.

func perform(request: URLRequest, completionHandler: @escaping() -> Void) { ... } 

시작하려면 : 그래서, 당신은 비동기 요청을 수행 몇 가지 방법을 가지고 있지만, 네트워크 요청이 완료되면 호출됩니다 폐쇄이었다 완료 핸들러의 매개 변수를 제공하는 것이, 두 번째를 들어, 가정하자 그들이이 완료되면이 두 개의 동시 요청, 당신은 같은 것을 할 거라고, 통보 :

let group = DispatchGroup() 

group.enter() 
perform(request: first) { 
    group.leave() 
} 

group.enter() 
perform(request: second) { 
    group.leave() 
} 

group.notify(queue: .main) { 
    print("both done") 
} 

분명히 perform(request:)의 구현은 크게 다를 수 있습니다 (예 : 당신이 폐쇄 다시 데이터를 전달해야 할 수도 있습니다) 그러나 당신이 URLSession과 함께 자신의 네트워킹 코드를 작성하던간에 패턴은 동일합니다. Alamofire를 사용합니다. GCD 그룹을 사용하고, 요청을 생성 할 때 그룹에 들어가고 그룹을 비동기 요청의 완료 핸들러에 남겨 둡니다.

+0

group.notify의 클로저는 기본적으로 완료 핸들러로 작동합니까? 그룹에 추가 된 두 작업이 모두 완료 되었습니까? 또한 그룹에 클로저를 입력하면 모든 요청을 추가 할 때까지 실행을 중단하는 것을 어떻게 알 수 있습니까? 내 초를 추가하기 전에 첫 번째 요청을 완료하면 무엇이 필요하며, 두 번째 요청이 아직 보류 중일 때 알림이 표시되기 때문에 무엇을 요청합니다. 일반적으로 문제가되지 않습니까? –

+0

예, 모든'enter' 호출이 해당'leave' 호출과 균형을 이룰 때 클로저가 호출됩니다. 따라서 모든 'leave'호출이 수신 된 후에 만 ​​디스패치 그룹'notify' 블록이 호출됩니다. – Rob

+0

질문에 대한 사과는 들지만 첫 번째 기능이 그룹에서 나가고 두 번째 기능이 그룹에 입력되기 전에 알리는 것이 가능하지는 않습니까? –

-1

출처 : How do I write dispatch_after GCD in Swift 3? dispatch_group을 사용할 수 있습니다. 예를 들어 (ObjC 코드) : 당신이 요청을 발행하고, 요청에 대한 완료 핸들러에서 그룹을 떠나기 전에

dispatch_group_t group = dispatch_group_create(); 

//startOperation1 
dispatch_group_enter(group); 

//finishOpeartion1 
dispatch_group_leave(group); 


//startOperation2 
dispatch_group_enter(group); 

//finishOpeartion2 
dispatch_group_leave(group); 


//Handle both operations completion 
dispatch_group_notify(group, dispatch_get_main_queue(), ^{ 
//code here 
});