微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法从 Swift 的下一页进行第二次 api 调用

如何解决无法从 Swift 的下一页进行第二次 api 调用

我正在使用 https://pokeapi.co/,我的第一个端点是 https://pokeapi.co/api/v2/pokemon

认情况下,结果数组限制为 20 个元素,更多信息 https://pokeapi.co/docs/v2#resource-listspagination-section

如果我从第一个端点调用数据,一切正常。但该响应还返回一个“下一个”元素,该元素具有我的下一页的端点,因此,当我使用该端点进行调用时,我会得到更多的戳等等。

当我进行第二次调用时,它没有返回任何内容。这是我的代码的样子:

    func fetchFirstPokes(pagination: Bool = false,handler: @escaping (Result<[Pokemon],Error>) -> Void) {
    
    var originalPokes = [Pokemon]()
    
    self.callAnyEndpoint(endpoint: endpoints["1"]!) { (next,urls) in
        
        self.getAnyPokes(pokesUrls: urls) { (result) in
            switch result {
            case .success(let pokemon):
                
                originalPokes.append(pokemon)
                originalPokes.sort { (poke1,poke2) -> Bool in
                    return poke1.id! < poke2.id!
                }

                self.getMorePokes(url: next) { (result) in
                    switch result {
                    case .success(let poke):
                        print(poke)
                    case .failure(let error):
                        print(error)
                    }
                }
                
                handler(.success(originalPokes))
            case .failure(let error):
                
                print(error.localizedDescription)
            }
        }
    }
}

func getMorePokes(url: String,handler: @escaping(Result<[Pokemon],Error>) -> Void) {
    
    var morePokes = [Pokemon]()
    
    self.callAnyEndpoint(endpoint: url) { (next2,myUrls) in
        self.getAnyPokes(pokesUrls: myUrls) { (result) in
            switch result {
            case .success(let poke):
                morePokes.append(poke)
                morePokes.sort { (poke1,poke2) -> Bool in
                    return poke1.id! < poke2.id!
                }
                
                handler(.success(morePokes))
                print(poke)
            case .failure(let error):
                print(error)
            }
        }
    }
}

func callAnyEndpoint(endpoint: String,handler: @escaping(String,[String]) -> Void) {
    AF.request(endpoint).validate().responseResource { (response) in
        
        do {
            guard let resource = response.value else { return }
            
            guard let results = resource.results,let nextUrl = resource.next,let count   = resource.count,let urls    = results.compactMap({$0.url!}) as [String]?
            else { return }
            
            print("""
                Current count: \(count)
                Next url: \(nextUrl)
                Data obtained: \(results.count) pokemons successfully
                """)
            
            handler(nextUrl,urls)
        } catch {
            print("DEBUG \(NetworkResponse.badRequest): \(error)")
        }
    }
}

func getAnyPokes(pokesUrls: [String],handler: @escaping(Result<Pokemon,Error>) -> Void) {

    for url in pokesUrls {
        AF.request(url).validate().responsePokemon { (pokeData) in
            guard let pokes = pokeData.value else { return }

            handler(.success(pokes))
        }
    }
}

老实说,我正在为分页而苦苦挣扎,但这种行为完全出乎意料。我从第一次调用中获得的“下一个”端点是:https://pokeapi.co/api/v2/pokemon?offset=20&limit=20,这就是我在 getMorePokes 调用中使用的端点。

如果有人对改进我的代码有建议,或者可以帮助我解决我做错的任何事情,我将不胜感激。我也知道,也许我没有很好地解释自己,所以,如果你们需要更多信息,请索取,我很乐意编辑和添加所需的任何代码块。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。