我有一个构建函数,用于从 API 获取最新项目。还有其他几个,具有不同的功能,但它们的工作原理都是一样的。它看起来像这样:
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()
函数返回存储在 requestedData()
中的 data
中的数据?
最佳答案
所以我通过这样做修复了它:
在第一种方法中,实际上需要来自 API 的数据,我添加了这个:
let trendingData = restApiManager.getLatest(pageNumber: 0, completion: { data -> Void in
let item = data[indexPath.row]
let url = NSURL(string: item.still)
let data = NSData(contentsOf: url as! URL)
if data != nil {
cell.image.image = UIImage(data:data! as Data)
}
})
getLatest()
方法如下所示:
func getLatest(pageNumber: Int, completion: @escaping ([ApiItem]) -> ()) {
let urlRequest = URL(string: baseUrl + trendingUrl + String(pageNumber))
let requestedData = doRequest(url: urlRequest!, completion: { data -> Void in
// We have the data from doRequest stored in data
var requestedData = data
completion(requestedData)
})
}
最后,doRequest()
方法如下所示:
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()
}
关于swift - 在方法A中,在方法B中从回调中获取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46003754/