我有一个函数,其中带有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调用中的completion(true)替换为另一个API调用,因此,当两个API调用都完成后,您的completion(true)将被调用。

希望这会有所帮助。

注意:

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

关于ios - 如何在同一函数中只有2个Alamofire请求的1个完成处理程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47949809/

10-10 13:41