gpt4 book ai didi

swift - REST API 调用无法快速工作

转载 作者:行者123 更新时间:2023-11-28 15:28:48 24 4
gpt4 key购买 nike

我正在按照本教程快速进行简单的 REST API 调用:https://grokswift.com/simple-rest-with-swift/
我遇到的问题是接下来执行数据任务完成处理程序。当我逐步调试它时,它只是跳过了完成处理程序 block 。控制台也没有打印任何内容。
我已经搜索了其他调用 REST API 的方法,但它们都与这个方法非常相似,而且也不起作用。

这是我的代码:

    let endpoint: String = "https://jsonplaceholder.typicode.com/todos/1"
guard let url = URL(string: endpoint) else {
return
}
let urlRequest = URLRequest(url: url)
let session = URLSession.shared

let task = session.dataTask(with: urlRequest) { (data, response, error) -> Void in
guard error == nil else {
print("Error calling GET")
return
}
guard let responseData = data else {
print("Error receiving data")
return
}
do {
print ("Parsing response...")
}
}
task.resume()

最佳答案

我觉得你的代码很合适。我在 Playground 中对其进行了测试,并且在控制台上打印了 Parsing response... 消息,这让我认为问题出在您的代码或环境中的其他地方。如果您可以发布 Github 链接或类似内容,我很乐意查看整个项目。

以下是我调试此类问题的步骤:

1) 确认我的执行环境具有有效的互联网连接。 Safari 应用程序可用于在 iOS 设备或模拟器上进行确认。可以通过粘贴以下行来测试 Playground 。

let url = URL(string: "https://jsonplaceholder.typicode.com/todos/1")!
print (try? String(contentsOf: url))

在控制台输出中查找类似于以下内容的行:

Optional("{\n  \"userId\": 1,\n  \"id\": 1,\n  \"title\": \"delectus aut autem\",\n  \"completed\": false\n}")

2) 确认 url 有效并通过将其粘贴到网络浏览器 url 栏并按回车键返回数据。您将在浏览器中看到或看不到 JSON。

3) 确认我的代码在应用程序运行时实际被调用。您可以使用断点或 print() 语句来执行此操作。正如 OOPer2 指出的那样,session.dataTask() 中使用的异步回调闭包在与其余代码不同的时间执行,这就是为什么 “它只是跳过完成处理程序 block ” 在单步执行调试器时。您需要在完成处理程序闭包中放置另一个断点或 print() 语句。我将断点放在 guard error == nil else { 行上。

4) 确保当网络请求完成并且完成处理程序闭包执行时应用程序仍在执行。如果您的代码在 iOS 应用程序中运行的 ViewController 中,它可能没问题,但如果它在 Playground 中运行,则可能不是。一旦最后一行代码被求值,Playgrounds 默认停止执行,这意味着完成闭包将永远不会执行。您可以通过导入 PlaygroundSupport 框架并在当前 Playground 页面上设置 needsIndefiniteExecution = true 来告诉 Playground 无限期地继续执行。将下面的整个代码块粘贴到 Playground 中以查看其运行情况:

import Foundation
import PlaygroundSupport

// Keep executing the program after the last line has evaluated so the
// closure can execute when the asynchronous network request finishes.
PlaygroundPage.current.needsIndefiniteExecution = true

// Generic Result enum useful for returning values OR an error from
// asynchronous functions.
enum Result<T> {
case failure(Error)
case success(T)
}

// Custom Errors to be returned when something goes wrong.
enum NetworkError: Error {
case couldNotCreateURL(for: String)
case didNotReceiveData
}

// Perform network request asynchronous returning the result via a
// completion closure called on the main thread.
//
// In really life the result type will not be a String, it will
// probably be an array of custom structs or similar.
func performNetworkRequest(completion: @escaping (Result<String>)->Void ) {
let endpoint: String = "https://jsonplaceholder.typicode.com/todos/1"

guard let url = URL(string: endpoint) else {
let error = NetworkError.couldNotCreateURL(for: endpoint)
completion(Result.failure(error))
return
}

let urlRequest = URLRequest(url: url)
let session = URLSession.shared

let task = session.dataTask(with: urlRequest) { (data, response, error) -> Void in
// This closure is still executing on a background thread so
// don't touch anything related to the UI.
//
// Remember to dispatch back to the main thread when calling
// the completion closure.

guard error == nil else {
// Call the completion handler on the main thread.
DispatchQueue.main.async {
completion(Result.failure(error!))
}
return
}
guard let responseData = data else {
// Call the completion handler on the main thread.
DispatchQueue.main.async {
completion(Result.failure(NetworkError.didNotReceiveData))
}
return
}

// Parse response here...

// Call the completion handler on the main thread.
DispatchQueue.main.async {
completion(Result.success("Sucessfully parsed results"))
}
}
task.resume()
}

performNetworkRequest(completion: { result in
// The generic Result type makes handling the success and error
// cases really nice by just using a switch statement.
switch result {
case .failure(let error):
print(error)

case .success(let parsedResponse):
print(parsedResponse)
}
})

关于swift - REST API 调用无法快速工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44938004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com