我想給我們一個返回一些json數據的RESTful API。我想封裝創建HTTP請求的代碼,並在自己的方法中設置標題,這樣我就可以通過輸入url String來調用它,然後讓該方法返回一個JSON對象。如何在Swift中使用completionHandler Closure?
在下面的代碼片段中,我已經創建了請求對象並設置了標頭,並且我調用了該變量「req」。我沒有聲明任何名爲data,response或error的對象。我有以下的代碼,正確打印出一個JSON對象
let sesh = NSURLSession.sharedSession()
let dataTask = sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error) in
var jsonError : NSError?
let jsonBlob = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableLeaves, error: &jsonError)
println(jsonBlob)
});
dataTask.resume()
因此,這裏是我的問題。我怎樣才能讓這個completionHandler塊能夠返回類型爲「AnyObject!」的jsonBlob?如果我稍微修改代碼,如下所示:
let sesh = NSURLSession.sharedSession()
let dataTask = sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error) -> AnyObject! in
var jsonError : NSError?
let jsonBlob : AnyObject! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableLeaves, error: &jsonError)
return jsonBlob
});
dataTask.resume()
程序將無法正常編譯調用dataTaskWithRequest:completionHandler給出了一個編譯器警告說:
Could not find an overload for 'dataTaskWithRequest' that accepts the supplied arguments
我不明白這一點。我使用的是正確的語法返回關閉,在此頁面雨燕文檔中給出:
爲什麼要返回數據?它應該返回到哪裏?目前還不清楚你想要做什麼 - 完成處理程序塊可能不會返回任何內容。 – jtbandes
您希望將什麼信息發回給主叫方?你的完成處理程序在這裏結束程序。 – holex
@jtbandes我需要使用Coinbase的API進行GET請求,然後從返回的JSON對象中提取數據。現在,完成塊運行並返回JSON,但一旦塊結束,響應數據就會丟失。我需要使用來自JSON響應對象的一些數據創建一個String對象,並讓它持續超出該塊的生命。從URL會話文檔我認爲我必須實現一些NSURLSessionDataDelegate協議,一旦返回響應就會觸發它們。它是否正確?儘管我寧願用一個簡單的完成塊來返回東西。 – almel