我有一個函數可以從API中獲取最新的項目。還有其他幾個功能不同,但它們都工作相同。它看起來像這樣:在方法A中,從方法B中的回調中獲取數據?
func getLatest(pageNumber: Int) -> Array<Any>{
let urlRequest = URL(string: baseUrl + latestUrl + String(pageNumber))
let requestedData = doRequest(url: urlRequest!, completion: { data -> Void in
// We have the data from doRequest stored in data, but now what?!
})
return allData
}
我也有一個處理請求的異步方法。那看起來像這樣:
func doRequest(url: URL, completion: @escaping ([[ApiItem]]) ->()){
var allItems = [[ApiItem]]()
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else { return }
do{
let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! [String: AnyObject]
let results = json["items"] as? [AnyObject]
for r in results!{
let item = ApiItem(json: r as! [String: Any])
allItems.append([item])
}
completion(allItems)
} catch let jsonError{
print("JSON error: \(jsonError)")
}
}.resume()
doRequest函數工作得很好。它獲取數據,解析JSON並將其發送回getLatest
- >requestedData
。現在的問題是getLatest()
是需要以返回存儲在data
變量requestedData
中的數據的函數。
我該怎麼做才能使getLatest()
函數返回data
中存儲的數據requestedData()
?
根據我們在您的[上一個問題](https://stackoverflow.com/q/46002165/2227743)中的評論給予getLatest與doRequest相同的待遇。 *回調中的回調*。在對doRequest的調用中(您有「現在發生了什麼」的評論),調用完成處理程序,您將添加到getLatest的簽名中。 //效果很好,我經常使用它。小心,但不要嵌套太多的回調,你會直接進入先知地獄。兩個都可以。 – Moritz
謝謝!我現在工作! – kaanmijo
請將您的代碼發佈在答案中,這對未來的用戶來說很好,可以看到完整的解決方案。 – Moritz