2017-10-15 171 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:

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

    network.getMultipleRequests([1,2]) 
} 

而且,而是采用group.wait()您可能需要使用group.notify,这是BETT呃,通知所有条目阔叶组中指定的队列,如主要

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

阅读有关DispatchGroups什么:

RayWenderlich

ALL ABOUT SWIFT

+0

它的工作。你救了我的一天!谢谢。 – eonr