2017-10-15 8 views
0

Alamofire 요청 프로세스를 수행하는 네트워크 클래스에 아래 기능이 있습니다. 내 모델 클래스에서이 함수를 호출 중이며 Alamofire가 요청을 완료하면 모델 클래스에 알리는 델리게이트 함수를 호출합니다. 내 문제는 내가이 Alamofire 함수를 여러 번 호출하고 모두 모델 클래스에 알리기 전에 끝내야한다는 것입니다. 이제 나는 그것을 아주 가짜로 처리한다. 내가 검색 할 때, DispatchGroup 사용할 수 있지만 그것을 구현할 방법을 알아낼 수 없습니다. 고맙습니다.여러 Alamofire 요청이 완료 될 때까지 대기

모델 클래스

@objc func refresh_fiks(){ 
    let network = Network() 
    network.delegate = self 
    self.teams = [[]] 
    network.getRequest(req: 1) 
    network.getRequest(req: 2) 

} 

요청 기능 : 나는 당신의 코드에서 몇 가지 변경 한

func response(){ 
    print(response_json.count) 
    if(response_json.count == path){ 
     self.delegate?.sendJson(response_json) 
    } 
    } 
    func getRequest(req: Int) { 
    path = req 
    let rot = Router(method: .get, path: req, parameters: nil) 
    Alamofire.request(rot) 
     .response { response in 
      print(response.request?.url! as Any) 
      // check for errors 
      guard response.error == nil else { 
       // got an error in getting the data, need to handle it 
       print(response.error!) 
       let errorJson: JSON = [ "Error" : "Can't get the data!"] 
       self.response_json.append(errorJson) 
       self.response() 
       return 
      } 
      // make sure we got some JSON since that's what we expect 
      guard (response.data?.base64EncodedString()) != nil else { 
       print("Error: \(String(describing: response.error))") 
       let errorJson: JSON = [ "Error" : "Can't get the data!"] 
       self.response_json.append(errorJson) 
       self.response() 
       return 
      } 
      guard response.response?.statusCode == 200 else{ 
       let errorJson: JSON = [ "Error" : "Can't get the data!"] 
       self.response_json.append(errorJson) 
       self.response() 
       return 
      } 
      let json = JSON(data: response.data!) 
      // get and print the title 
      if json != nil{ 
       self.response_json.append(json) 
       self.response() 
      } else { 
       let errorJson: JSON = [ "Error" : "Can't get the data!"] 
       self.response_json.append(errorJson) 
       self.response() 
       return 
      } 
    } 
} 

답변

0

:

네트워크 클래스 :

func response(array: [JSON]){ 
    print(array.count) 
    if(array.count == path){ 
     self.delegate?.sendJson(array) 
    } 
} 

func getMultipleRequests(_ requests: [Int]) { 
    DispatchQueue.global(qos: .background).async { 
     let group = DispatchGroup() 

     var array: [JSON] = [] 

     for request in requests { 

      group.enter() 

      self.getRequest(req: request, completion: { (json) in 
       array.append(json) 
       group.leave() 
      }) 
     } 

     group.wait() 
     //this line below won't be called until all entries will leave the group 
     self.response(array: array) 
    } 
} 

func getRequest(req: Int, completion: @escaping (_ json: JSON) -> Void) { 
    path = req 
    let rot = Router(method: .get, path: req, parameters: nil) 
    Alamofire.request(rot) 
     .response { response in 
      print(response.request?.url! as Any) 
      // check for errors 
      guard response.error == nil else { 
       // got an error in getting the data, need to handle it 
       print(response.error!) 
       let errorJson: JSON = [ "Error" : "Can't get the data!"] 
       completion(errorJson) 
       return 
      } 
      // make sure we got some JSON since that's what we expect 
      guard (response.data?.base64EncodedString()) != nil else { 
       print("Error: \(String(describing: response.error))") 
       let errorJson: JSON = [ "Error" : "Can't get the data!"] 
       completion(errorJson) 
       return 
      } 
      guard response.response?.statusCode == 200 else{ 
       let errorJson: JSON = [ "Error" : "Can't get the data!"] 
       completion(errorJson) 
       return 
      } 
      let json = JSON(data: response.data!) 
      // get and print the title 
      if json != nil{ 
       completion(json) 
      } else { 
       let errorJson: JSON = [ "Error" : "Can't get the data!"] 
       completion(errorJson) 
       return 
      } 
    } 
} 
그래서

대해 GetRequest 기능은 이제, JSON이 당신이 그것을

귀하의 클래스를 사용하는 방법을 각 요청과 기능 getMultipleRequests 사람

에서 요청의 무리를 받게됩니다을 결과를 반환하는 완료 블록이 그 refresh_fiks 전화 : 당신이 group.notify을 사용해야 할 수도 있습니다 또한

@objc func refresh_fiks(){ 
    let network = Network() 
    network.delegate = self 
    self.teams = [[]] 

    network.getMultipleRequests([1,2]) 
} 

대신 group.wait()의 사용을, 그것은 BETT입니다 어 모든 항목이 주요처럼, 지정된 큐에서 그룹을 잎이 달린 것을 알리기 위해 다음 DispatchGroups에 대해 읽어 무엇

group.notify(queue: DispatchQueue.main, execute: { 
    print("All Done") 
    self.response(array: array) 
}) 

가 :

RayWenderlich

ALL ABOUT SWIFT

+0

그것은했다. 너는 나의 하루를 구했다! 고맙습니다. – eonr