包含闭包的swift函数的空返回值

时间:2015-04-26 09:53:57

标签: ios xcode swift

我创建了一个函数,该函数应该返回一个字典,其中填充了在线检索的数据(使用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字典?

1 个答案:

答案 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.
}