首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在方法A中,从方法B的回调中获取数据?

在方法A中,从方法B的回调中获取数据?
EN

Stack Overflow用户
提问于 2017-09-01 15:41:12
回答 2查看 114关注 0票数 1

我有一个函数,用于从API中获取最新的项目。还有几个不同的功能,但它们的工作原理都是一样的。看起来是这样的:

代码语言:javascript
复制
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
}

我还有一个异步方法来处理请求。那个看起来是这样的:

代码语言:javascript
复制
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()是一个需要返回存储在requestedDatadata变量中的数据的函数。

如何使getLatest()函数返回存储在datarequestedData()中的数据

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-02 10:30:34

所以我通过这样做解决了这个问题:

在第一个实际需要API数据的方法中,我添加了以下内容:

代码语言:javascript
复制
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()方法如下所示:

代码语言:javascript
复制
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()方法如下所示:

代码语言:javascript
复制
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()
}
票数 0
EN

Stack Overflow用户

发布于 2017-09-01 21:34:16

我要做的是使用Singleton来存储数据

代码语言:javascript
复制
class DataManager:NSObject
{
  static let instance  = DataManager()
  override private init(){}


  var items:[ApiItem] = []
}

然后,在你的第一种方法中,我会这样做:

代码语言:javascript
复制
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
    })

}

这就是我通常处理这种情况的方式。也许还有更好的选择..。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46003754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档