Ios 如何在同一函数中仅为2个Alamofire请求提供1个完成处理程序

Ios 如何在同一函数中仅为2个Alamofire请求提供1个完成处理程序,ios,swift,alamofire,completionhandler,Ios,Swift,Alamofire,Completionhandler,我有一个函数,里面有2个Alamofire请求和一个完成处理程序。一旦两个请求都从服务器下载完数据,我想重新加载collectionView。我在函数中有一个完成处理程序,但它会被调用两次,这会导致我的collectionView重新加载两次,我希望只重新加载一次。有没有办法让我这样做?非常感谢你 func getFeedVideos(completion: @escaping (_ completedDownloadVideo: Bool) -> ()){ Alamofire.

我有一个函数,里面有2个Alamofire请求和一个完成处理程序。一旦两个请求都从服务器下载完数据,我想重新加载collectionView。我在函数中有一个完成处理程序,但它会被调用两次,这会导致我的collectionView重新加载两次,我希望只重新加载一次。有没有办法让我这样做?非常感谢你

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)
        }
    }
}
下面是我在ViewDidLoad中调用函数的方式

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

更新您的
getFeedVideos
方法,如下所示:

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)
        }
    }
}
正如我在您的代码中看到的,您在两个API调用中都调用了
completion(true)
,这就是为什么它会多次重新加载。在我的代码中,我用另一个API调用替换了您的第一个API调用中的
completion(true)
,因此一旦您的两个API调用都完成,您的
completion(true)
将调用

希望这会有所帮助

注意:

没有在Xcode上检查此代码,因此如果您对此代码有任何问题,请告诉我。

更好的解决方案

使用
DispatchGroup
以下是示例

   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()
    }
这是神奇的线条

dispatchGroup.notify(队列:.main){

打印(“两个功能都完成了!我只需要在第二次请求呼叫中输入self供参考。非常感谢!@kevinvu乐于帮助:)