繁体   English   中英

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

[英]In method A, get data from callback in method B?

我有一个从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()函数返回存储在数据datarequestedData()

因此,我通过执行以下操作修复了该问题:

在第一种方法中,实际需要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()
}

我要做的是使用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
    })

}

我通常就是这样处理这种情况的。 不过可能还有更好的选择...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM