【发布时间】:2020-10-11 00:45:47
【问题描述】:
好的,所以我已经尝试解决这个问题 2 天了,希望有人能提供帮助。
快速背景,我正在对数据进行 api 请求。使用调用我制作的服务功能的功能。现在一切都在第一次加载时运行良好,collectionview 加载正常。在某个时候,我再次调用更多数据。现在接受我得到一个 URL 错误。 这在我的 iPhone 上不起作用,但在模拟器上可以完美运行,所以不确定它可能是什么。 这是发出 api 请求的服务函数:
func fetchYoutubeData(interest: String, maxResult: Int, pageToken: String, completion: @escaping(Result<Youtube, WHError>) -> Void) {
let urlString = baseYoutubeURL+interest+youtubeAPIKey+"&maxResults=\(maxResult)&pageToken=\(pageToken)"
guard let url = URL(string: urlString) else {
completion(.failure(.URLError))
return
}
let session = URLSession.shared
let task = session.dataTask(with: url) { (data, _, error) in
if let _ = error {
completion(.failure(.DataError))
return
}
guard let data = data else { return }
do {
let result = try JSONDecoder().decode(Youtube.self, from: data)
print(result)
completion(.success(result))
} catch {
completion(.failure(.JSONError))
}
}
task.resume()
}
这是我的控制器函数,它调用服务并在完成时处理数据:
func fetchNewData(maxResult: Int, pageToken: String) {
guard let interest = self.interest.text else { return }
print(pageToken)
NetworkServices.shared.fetchYoutubeData(interest: interest, maxResult: maxResult, pageToken: pageToken) { [unowned self] (result) in
switch result {
case .success(let youtubeGroup):
let items = youtubeGroup.items
self.youtubeData.items.append(contentsOf: items)
DispatchQueue.main.async {
self.horizontalCollectionView.reloadData()
}
case .failure(let error):
print("DOES GET ERROR")
print(error)
}
}
}
再次,它在模拟器上完美运行,但在我的设备上,我可以第一次调用工作,但之后,一旦我使用 pageToken 获取更多数据,我得到一个 URL 错误。
任何帮助将不胜感激
【问题讨论】:
-
如果您能提供您收到的具体错误消息,将会有所帮助。
-
@MikeTaverne,当然这只是一个自定义错误响应。我有一个用于处理网络错误的枚举。从 urlString 创建 URL 时,错误出现在 guard 语句中。响应为:URLError:“端点 URL 错误”操作无法完成。 (Whats_Hunt.WHError 错误 0。) 0 是选定的枚举索引。不确定这是否对您有帮助。我想知道这是否与 Simulator vs my Device 中的 iOS 版本有关?
-
嗯...这对一些人有帮助。失败时的 URL 字符串是什么?
-
当我提出第二个请求时,我添加了 pageToken,这就是错误发生的时候。接受我所说的它在模拟器上运行时工作,当我把这个 URL 放在浏览器中时,我得到了我的数据。 googleapis.com/youtube/v3/… Development&key=MY_KEY&maxResults=48&pageToken=CDAQAA 不知道为什么会这样
-
@MikeTaverne 你看 URL 字符串是对的,我忘记在第二次数据调用中正确格式化 q 字符串。不知道如何从评论中给你信用。否则我会
标签: swift api networking youtube-api