2017-10-15 7 views
0

Alamofire要求プロセスを実行するネットワーククラスに以下の機能があります。自分のモデルクラスでこの関数を呼び出しています.Alamofireがリクエストを終了すると、モデルクラスに通知するdelegate関数が呼び出されます。私の問題は、この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について読むために何を:すべてのエントリがメインのように、指定されたキュー内のグループに葉のことを通知するER

RayWenderlich

ALL ABOUT SWIFT

+0

それは働きました。あなたは私の一日を救った!ありがとうございました。 – eonr

関連する問題