我创建了一个函数,该函数应该返回一个字典,其中填充了在线检索的数据(使用json,基于Ray Wenderlich tut)。该代码处于封闭状态。问题是首先返回一个空字典,然后才会填充它。不知道这是否与获取远程数据有些延迟有关,但显然我需要在返回之前先填充字典。这是代码。
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
字典?
答案 0 :(得分:1)
您应该在方法中使用Closures将statusUpdates作为其Async方法返回。 空的statusUpdates将立即在您的代码中返回,但在使用闭包时,您可以等到DataManager.getStatusDataWithSuccess完成:
typealias RemoteStatusHandler = (status:[StatusModel]) -> Void
func getStatusFromRemoteSource(handler:RemoteStatusHandler){
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)")
}
handler(status: statusUpdates)
}
}
然后可以像这样调用你的函数:
getStatusFromRemoteSource { (status) -> Void in
//use status here, this function is void.
}