2017-12-08 15 views
0

IDプロパティを持つUserクラスがあります。私はこのクラス(ID値)を満たすAlamofireリクエストを行います。ボタンをタップすると、ユーザーIDを送信する別のAlamofireリクエストを行います。最初のリクエストで7人のユーザーを取得していますので、2番目のリクエストは7回完了しました。ボタンをタップすると、私はそのプロセスを継続したいので、ボタンをタップすると最初のリクエスト - > 2回目のリクエスト(7回) - >最初のreq - > 2回目のreq(7回).....問題がある最初の要求が完了するのを待つ。これを行う最善の方法は何でしょうか?私はグループを作ることを考えているが、わからない。2つのAlamofire関数を1つずつ呼び出します。

func cont_like(){ 
    for var i in 0..<3{ 
     let group = DispatchGroup() 
     let group2 = DispatchGroup() 
     group2.enter() 
     group.enter() 
     Network.sharedInstance.like_all(completion: { 
      group.leave() 
     }) 
     group.enter() 
     Network.sharedInstance.get_rec(completion: {response in 
      print(response) 
      group.leave() 
     }) 

     group.notify(queue: .main){ 
      print("Both Req Done") 
      group2.leave() 
     } 
    }} 

2番目のリクエスト:

func like(sender_id: String, completion: @escaping() ->()){ 
    if let key = api_key{ 
     let headers: HTTPHeaders = [ 
      "X-Auth-Token": key, 
      "Accept": "application/json" 
     ] 
     Alamofire.request(baseUrl + likeURL + sender_id, method: .get, parameters: nil, encoding: URLEncoding.default, headers: headers).responseData(completionHandler: { (response) in 
      let jsonData = JSON(response.data!) 

      guard response.result.isSuccess else { 
       print("Error while fetching tags: \(response.result.error!)") 
       return 
      } 
      if let error = response.error{ 
       print("Error Occured with Request: \(error)") 
      } 
      if let matched = jsonData["match"].bool{ 
       print("Liked!: \(matched)") 
       if(matched){ 

       } 
      }else{ 
       print("There is an error with liking :(") 
      } 

     }) 
    } 
} 

まず要求:すべてのFunctonよう

func get_rec(completion: @escaping (String?) ->()){ 
    if let key = api_key{ 
     let headers: HTTPHeaders = [ 
      "X-Auth-Token": key, 
      "Accept": "application/json" 
     ] 
     Alamofire.request(baseUrl + recom, method: .get, parameters: nil, encoding: URLEncoding.default, headers: headers).responseData(completionHandler: { (response) in 
      if response.result.isFailure{ 
       completion(nil) 
       self.delegate?.metaError() 
       return 
      }else{ 
       do { 
        let decoder = JSONDecoder() 
        let root = try decoder.decode(Root.self, from: response.data!) 
        SharedUsers.sharedUser.populateData(sender: root.data) 
        print(SharedUsers.sharedUser.users[0].id) 
        self.delegate?.updated() 
        completion("Fetched") 
        self.delegate?.updated() 

       } catch { 
        print("error: ", error) 
        completion(nil) 
        self.delegate?.metaError() 
       } 
      } 

     }) 
    } 
    else{ 
    print("Error") 
    } 
} 

func like_all(completion: @escaping() ->()){ 
     let group2 = DispatchGroup() 
     group2.enter() 
     for user in SharedUsers.sharedUser.users{ 
      if let id = user.id{ 
       let group = DispatchGroup() 
       group.enter() 
       let when = DispatchTime.now() + 0.5 // change 2 to desired number of seconds 
       DispatchQueue.main.asyncAfter(deadline: when) { 
        Network.sharedInstance.like(sender_id: id) { result in 
         group.leave() 
         print(result) 
        } 

       } 
      } 
      else{ 
       continue 
      } 
     } 
     group2.leave() 
     completion() 
    } 

編集:私は機能を編集したが、それでも最初の要求が呼ばれていますすべてのようなreqを待つことなくユエステ。

+0

https://stackoverflow.com/questions/11909629/waiting-until-two-async-blocks-are-executed-before-starting-another-block –

+0

すべての最初のリクエストを非同期で送信した後最初のreqはそれを2番目のreqと呼びますか?このアプローチはあなたのために働くでしょうか? –

+0

これを実現するには、GCDを使用してDispatchGroupをswift 3で実行します。すべてのタスクが終了したら通知を受け取ることができます。 –

答えて

0

は異なるアプローチがあり一つはもう一つのaddDependencyによってNSOperationQueueあるDispatchGroup

let group = DispatchGroup() 

    group.enter() 
    func like(sender_id: String, completion: @escaping() ->()){ 
     group.leave() 
    } 

    group.enter() 
    func get_rec(completion: @escaping (String?) ->()){ 
     group.leave() 
    } 

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

です。

+0

このグループに遅延を追加することはできますか。例えば、私はget_recが終了してから3秒待っていますか? –

+0

遅延の必要はありません。完了ブロックのようなfuncは、group.leave()を追加します。その後get_rec startを実行します –

+0

私はそのグループを1回呼び出すだけで動作しますが、私はそれを順番に呼び出すことができるようにWhile(真)に入れます。しかし、私がそれをするとき、それは動作しません。 –

関連する問題