swift - 在方法A中,在方法B中从回调中获取数据?

标签 swift callback

我有一个构建函数,用于从 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/

相关文章:

swift - 快速更改 backButtonItem 的标题

javascript - 遍历包含图像的数组并删除带有错误 Javascript 的图像

ruby-on-rails - 我应该从模型回调还是从 Controller 发送邮件?

ios - 如何使用 URL 显示图像?

ios - 在 Xcode/Swift 中使用预设置 View

ios: 具有 Aspect Fill 的 UIImageView 不适合约束

javascript - 无法从响应中提取ajax成功函数变量

ios - NSArray 元素无法匹配 Swift 数组元素类型预期 NSMutableArray 但发现 __NSDictionaryI :

javascript - dialog.showMessageBox 不返回 Electron main.js 中的按钮索引

Java调用API : Call the C function back from the java code