swift 完成处理程序无法处理API请求[已关闭]

oyt4ldly  于 2023-05-21  发布在  Swift
关注(0)|答案(1)|浏览(142)

已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

2天前关闭。
Improve this question
我的代码执行API请求并加载数据。在下一步中,数据将显示为Map上的标记。但现在它的顺序是错误的。我的控制台首先显示"Second line of code executed",然后显示"The Data has been loaded"。结果是POI不会显示在我的Map上。
下面是我下载和解析数据的方式:

struct hereApi {

static var dataFromHereApi = [Items]()
static var gewählteKategorie = 0

func fetchPoi(geoCordinate: String) {
    
    var selectedCategory = "0"

    selectedCategory = {
        switch hereApi.gewählteKategorie {
        case 0:
            return
            "gym"
        case 1:
            return "school"
        default:
            return "cinema"
        }
    }()
    
    let urlString = "https://..."
    performRequest(urlString: urlString)
}

func performRequest(urlString: String) {
    if let url = URL(string: urlString) {
        let session = URLSession(configuration: .default)
        let task = session.dataTask(with: url) { data, response, error in
            
            if error != nil {
                print(error!)
                return
            }
            if let safeData = data {
                parseJSON(poiData: safeData)
            }
        }
        task.resume()
    }
}

func parseJSON(poiData: Data) {
    let decoder = JSONDecoder()
    do {
        let decodedData = try decoder.decode(POIData.self, from: poiData)
        hereApi.dataFromHereApi = decodedData.items
        
        print("The Data has been loaded.")
        
        
    } catch {
        print(error)
    }
    
}

}
这是我在另一个ViewController中执行请求的方式:

var networkGoogleApiConnect = hereApi()
    
        func loadDataFromApi(arg: Bool, completion: (Bool) -> ()) {
...
            networkGoogleApiConnect.fetchPoi(geoCordinate: fullCordinate)            
            completion(arg)
        }
        
        loadDataFromApi(arg: true, completion: { (success) -> Void in
            print("Second line of code executed")
            if success {
                  print("true")
            } else {
                 print("false")
            }
        })
tvokkenx

tvokkenx1#

关于网络代码的事情是,因为你没有采用async/await,你的其他代码在网络发生时不会暂停。因此,在网络有机会开始之前,你所有的代码就已经完成了。这导致了“无序”的抱怨--因为在网络和异步代码中,事情确实是无序发生的。
因此,如果您要使用完成处理程序,则需要此事件链中的 every 方法都有一个完成处理程序。所以:

  • session.dataTask有一个完成处理程序,您已经实现了它。到目前为止,一切顺利。
  • performRequest必须有一个完成处理程序,当我们从网络请求中返回时,它会在session.dataTask的完成处理程序中调用它。
  • fetchPoi必须有一个完成处理程序,它在来自performRequest的完成处理程序中调用它。
  • 然后,loadDataFromApifetchPoi调用完成处理程序中的完成处理程序。

(If如果你不明白为什么,请阅读从http://www.programmingios.net/what-asynchronous-means/.开始的三篇文章)
但一个更简单的解决方案是在整个系统中采用async/await

相关问题