2017-12-08 1 views
0

ID 속성이있는 User 클래스가 있습니다. 이 클래스 (ID 값)를 충족시키는 Alamofire 요청을 수행합니다. 버튼을 누르면 사용자 ID를 보내는 또 다른 Alamofire 요청을합니다. 첫 번째 요청에서 7 명의 사용자를 얻었으므로 두 번째 요청은 7 번 완료되었습니다. 버튼을 두드리면 버튼을 두드리면 첫 번째 요청 -> 두 번째 요청 (7 번) -> 첫 번째 req -> 두 번째 req (7 번) .....해야합니다. 첫 번째 요청이 완료 될 때까지 대기하고 두 번째 요청이 모두 대기되도록합니다. 이 일을하는 동안 최선의 방법은 무엇입니까? 그룹을 만들려고 생각하고 있지만 확실하지 않습니다.두 개의 Alamofire 함수를 하나씩 호출하십시오.

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() 
     } 
    }} 

두 번째 요청 :

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는 두 번째 req라고 부릅니다. 이 접근 방식이 효과가 있습니까? –

+0

신속한 3에서 DispatchGroup을 사용하여 GCD를 사용하여이 작업을 수행 할 수 있습니다. 모든 작업이 완료되면 알림을받을 수 있습니다. –

답변

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

그 그룹을 한 번만 호출하면 작동하지만, 순차적으로 호출 할 수 있도록 While (true)에 넣습니다. 하지만 그렇게하면 작동하지 않습니다. –

관련 문제