2017-09-01 40 views
1

我有一個函數可以從API中獲取最新的項目。還有其他幾個功能不同,但它們都工作相同。它看起來像這樣:在方法A中,從方法B中的回調中獲取數據?

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()函數返回data中存儲的數據requestedData()

+0

根據我們在您的[上一個問題](https://stackoverflow.com/q/46002165/2227743)中的評論給予getLatest與doRequest相同的待遇。 *回調中的回調*。在對doRequest的調用中(您有「現在發生了什麼」的評論),調用完成處理程序,您將添加到getLatest的簽名中。 //效果很好,我經常使用它。小心,但不要嵌套太多的回調,你會直接進入先知地獄。兩個都可以。 – Moritz

+0

謝謝!我現在工作! – kaanmijo

+0

請將您的代碼發佈在答案中,這對未來的用戶來說很好,可以看到完整的解決方案。 – Moritz

回答

0

所以我做這個固定:

在第一種方法,實際上從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() 
} 
-1

我會做的是使用單例中,我可以存儲數據

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 
    }) 

} 

這是怎麼了,我通常去這種情況。有可能是雖然更好的選擇......

相關問題