2017-12-23 29 views
1

완료 처리기 안에 2 개의 Alamofire 요청이있는 함수가 있습니다. 두 요청이 모두 서버에서 데이터 다운로드를 완료하면 collectionView를 다시로드하려고합니다. 함수에서 완료 핸들러가 있지만 두 번 호출되어 collectionView를 두 번 다시로드하고 한 번만 다시로드하는 것을 좋아합니다. 내가 그렇게 할 수있는 방법이 있니? 정말 고맙습니다!동일한 함수에서 2 개의 Alamofire 요청에 대해 하나의 완료 처리기를 갖는 방법

func getFeedVideos(completion: @escaping (_ completedDownloadVideo: Bool) ->()){ 

    Alamofire.request(youTubeUrl, method: .get, parameters: ["part":"snippet","maxResults": "20","nextPageToken" : "pageToken", "playlistId": playListId, "key": googleAPIKey], encoding: URLEncoding.default, headers: nil).responseJSON { (response) in 
     guard let data = response.data else {return} 
     do { 
      let json = try JSONDecoder().decode(serverData.self, from: data) 
      self.dataFromAPI = json.items 

      Alamofire.request(youTubeChannelUrl, method: .get, parameters: ["part":"snippet", "key": googleAPIKey, "id": youTubeChannelId], encoding: URLEncoding.default, headers: nil).responseJSON { (response) in 
       guard let data = response.data else {return} 
       do { 
        let json = try JSONDecoder().decode(channelInfo.self, from: data) 
        self.channelData = json.items 
        completion(true) 
       } catch let jsonErr{ 
        print(jsonErr) 
       } 
      } 
     } catch let jsonErr{ 
      print(jsonErr) 
     } 
    } 
} 

난 당신이 completion(true)를 호출하는 코드에보고하고 같이 여기

func getFeedVideos(completion: @escaping (_ completedDownloadVideo: Bool) ->()){ 

    Alamofire.request(youTubeUrl, method: .get, parameters: ["part":"snippet","maxResults": "20","nextPageToken" : "pageToken", "playlistId": playListId, "key": googleAPIKey], encoding: URLEncoding.default, headers: nil).responseJSON { (response) in 
     guard let data = response.data else {return} 
     do { 
      let json = try JSONDecoder().decode(serverData.self, from: data) 
      self.dataFromAPI = json.items 
      completion(true) 
     } catch let jsonErr{ 
      print(jsonErr) 
     } 
    } 

    Alamofire.request(youTubeChannelUrl, method: .get, parameters: ["part":"snippet", "key": googleAPIKey, "id": youTubeChannelId], encoding: URLEncoding.default, headers: nil).responseJSON { (response) in 
     guard let data = response.data else {return} 
     do { 
      let json = try JSONDecoder().decode(channelInfo.self, from: data) 
      self.channelData = json.items 
      completion(true) 
     } catch let jsonErr{ 
      print(jsonErr) 
     } 
    } 
} 

하고 아래와 같이 나는 당신의 getFeedVideos 방법 업데이트의 viewDidLoad

override func viewDidLoad() { 
    super.viewDidLoad() 
    getFeedVideos { (complete) in 
     if complete{ 
      DispatchQueue.main.async { 
       self.collectionView?.reloadData() 
      } 
     } 
    } 
} 

답변

0

에있는 함수를 호출하는 방법입니다 두 API 호출에서 여러 번 다시로드하는 이유는 무엇입니까? 내 코드에서는 completion(true)을 첫 번째 API 호출에서 다른 API 호출로 바꿨으므로 두 API 호출이 완료되면 completion(true)이 호출됩니다.

희망이 도움이 될 것입니다.

참고 :

그래서 당신이 코드에 어떤 문제를 가지고 있으면 알려 주시기 엑스 코드에이 코드를 확인하지 않았다.

+0

작동합니다! 두 번째 요청 호출 내에서 참조를 위해 자 체를 넣기 만하면됩니다. 고마워요! –

0

더 나은 솔루션

사용 DispatchGroup 여기에 마법 라인

dispatchGroup.notify(queue: .main) { 
    print("Both functions complete ") 
} 

를 호출 할 때마다 입력()를 호출하여 나중에 일치해야합니다 예를

다음
let dispatchGroup = DispatchGroup() 

    dispatchGroup.enter() 

Alamofire.request(youTubeUrl, method: .get, parameters: ["part":"snippet","maxResults": "20","nextPageToken" : "pageToken", "playlistId": playListId, "key": googleAPIKey], encoding: URLEncoding.default, headers: nil).responseJSON { (response) in 
     guard let data = response.data else {return} 
     do { 
      let json = try JSONDecoder().decode(serverData.self, from: data) 
      self.dataFromAPI = json.items 
      completion(true) 
     } catch let jsonErr{ 
      print(jsonErr) 
     } 
     dispatchGroup.leave() 
    } 

dispatchGroup.enter() 

    Alamofire.request(youTubeChannelUrl, method: .get, parameters: ["part":"snippet", "key": googleAPIKey, "id": youTubeChannelId], encoding: URLEncoding.default, headers: nil).responseJSON { (response) in 
     guard let data = response.data else {return} 
     do { 
      let json = try JSONDecoder().decode(channelInfo.self, from: data) 
      self.channelData = json.items 
      completion(true) 
     } catch let jsonErr{ 
      print(jsonErr) 
     } 
     dispatchGroup.leave() 
    } 

입니다()를 남겨두면 그룹은 notify()에 제공된 종결자를 호출합니다.

+0

@kevinvu 도와 드리겠습니다 :) –