我創建了一個函數,該函數應該返回一個填充了數據的字典(使用json,基於Ray Wenderlich tut)。該代碼處於關閉狀態。問題是一個空字典首先被返回,並且只有在它被填充之後。不知道這是否與延遲獲取遠程數據有關,但顯然我需要在返回字典之前先填充字典。這是代碼。來自包含閉包的swift函數的空返回值
func getStatusFromRemoteSource() -> [StatusModel] {
var statusUpdates = [StatusModel]()
println("statusUpdates after initialization: \(statusUpdates)") // 1
DataManager.getStatusDataWithSuccess { (statusData) -> Void in
let json = JSON(data: statusData)
if let jsonArray = json.array {
for jsonItem in jsonArray {
var statusVersion: String? = jsonItem["version"].string
var statusDescription: String? = jsonItem["message"].string
var statusCode: Int? = jsonItem["code"].string!.toInt()
var update = StatusModel(version: statusVersion, message: statusDescription, code: statusCode)
statusUpdates.append(update)
println("statusUpdates after appending update: \(statusUpdates)") // 3 (after other function call)
}
let item = 0
println("Version \(statusUpdates[item].version) has status \(statusUpdates[item].message)")
// println("Status code: \(statusUpdates[item].code)")
}
}
println("Status updates before return: \(statusUpdates)") // 2
return statusUpdates
}
所以//1
首先打印,然後//2
(仍然爲空),然後其他的功能(即調用此一個)被調用。只有//3
與正在檢索的內容一起打印(正確)。
如何在返回之前填入statusUpdates
字典?
你應該在這種情況下考慮使用閉包! –
異步完成的函數不能返回值,因爲如您所述,數據尚未被檢索。你可以給函數提供一個閉包,或者從這個函數的成功閉包中調用另一個函數 – Paulw11