如何解决无法从 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 举报,一经查实,本站将立刻删除。