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()
に戻すようにするにはどうすればよいですか?
func getLatest(pageNumber: Int){
let urlRequest = URL(string: baseUrl + latestUrl + String(pageNumber))
let requestedData = doRequest(url: urlRequest!, completion: { data -> items in
// We have the data from doRequest stored in data, but now what?!
DataManager.instance.items = items
})
}
これは私が通常約行く方法です:私はどうなるのか
あなたの[前の質問](https://stackoverflow.com/q/46002165/2227743)に記載されているコメントに従って、お試しいただきたいのと同じ扱いを取得してください。 *コールバックのコールバック*。 doRequestへの呼び出し(あなたの "今何"のコメントがあるか)の中で、getLatestのシグネチャに追加した補完ハンドラを呼び出します。 //素晴らしい作品で、しばしばそれを使用します。あまりにも多くのコールバックを入れ子にしないように注意してください。あなたはまっすぐInception地獄に行くでしょう。 2人は大丈夫です。 – Moritz
ありがとう!私は今働いている! – kaanmijo
あなたのコードを回答に投稿してください。将来のユーザが完全な解決策を見るのがいいかもしれません。 – Moritz