我有一个函数,用于从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()是一个需要返回存储在requestedData的data变量中的数据的函数。
如何使getLatest()函数返回存储在data中requestedData()中的数据
发布于 2017-09-02 10:30:34
所以我通过这样做解决了这个问题:
在第一个实际需要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()
}发布于 2017-09-01 21:34:16
我要做的是使用Singleton来存储数据
class DataManager:NSObject
{
static let instance = DataManager()
override private init(){}
var items:[ApiItem] = []
}然后,在你的第一种方法中,我会这样做:
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/questions/46003754
复制相似问题