包含闭包的swift函数的空返回值 [英] Empty return value from swift function containing closure

查看:206
本文介绍了包含闭包的swift函数的空返回值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个函数,该函数应该返回一个字典,其中填充了在线检索的数据(使用json,基于Ray Wenderlich tut)。该代码处于封闭状态。问题是首先返回一个空字典,然后才填充它。不知道这是否与获取远程数据有些延迟有关,但显然我需要在返回之前先填充字典。这是代码。

I created a function that should return a dictionary filled with data that are retrieved (using json, based on Ray Wenderlich tut) online. That code is in a closure. The problem is that an empty dictionary is returned first, and only afterwards it gets filled. Don't know if this is related to some delay in getting the remote data, but obviously I need the dictionary to be filled first before returning it. Here is the code.

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 打印(正确)与应检索的内容。

So //1 prints first, then //2 (still empty) and then the other function (that calls this one) is called. Only then //3 is printed (correctly) with the content that should be retrieved.

我如何填写返回之前 statusUpdates 字典?

How can I fill the statusUpdates dictionary before returning it?

推荐答案

你应该使用Closures in返回statusUpdates作为其Async方法的方法。
空状态更新将立即在您的代码中返回,但在使用闭包时,您可以等到DataManager.getStatusDataWithSuccess完成:

You should use Closures in method to return statusUpdates as its Async method. The empty statusUpdates will be returned immediately in your code but when using closures, you can wait till DataManager.getStatusDataWithSuccess is finished:

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


}

然后可以像这样调用你的函数:

Then your function can be called like this:

getStatusFromRemoteSource { (status) -> Void in
   //use status here, this function is void.
}

这篇关于包含闭包的swift函数的空返回值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆