变量不断返回nil-Swift iOS

变量不断返回nil-Swift iOS,swift,alamofire,Swift,Alamofire,我正在使用Alamofire解析JSON数据。在下面提到的代码中,除了“var id:JSON?”变量之外,其他一切都正常工作,尽管它更新得很好,但在某一点(底部)它一直返回nil。我需要把这个变量放在过滤器闭包中 class GreetingObjectHandler { var greetings: [Greeting] = [] var id: JSON? //this variable init(filename: String) { Alamof

我正在使用Alamofire解析JSON数据。在下面提到的代码中,除了“var id:JSON?”变量之外,其他一切都正常工作,尽管它更新得很好,但在某一点(底部)它一直返回nil。我需要把这个变量放在过滤器闭包中

class GreetingObjectHandler {
    var greetings: [Greeting] = []
    var id: JSON? //this variable
    init(filename: String) {
        Alamofire.request(.GET, "http://localhost:2403/users/me")
            .responseJSON { (req, res, data, error) in
                if(error != nil) {
                    NSLog("Error: \(error)")
                }
                else {
                    var parse = JSON(data!)
                    self.id = parse["id"] //updating 
                    println(self.id) //it's fine here
                }
        }

        let filePath = NSURL(string: "http://localhost:2403/users")
        let jsonData = NSData(contentsOfURL:filePath!)
        let json = JSON(data: jsonData!, options: NSJSONReadingOptions.AllowFragments, error: nil)

        for (key: String, subJson: JSON) in json {

            var language:String?, link: String?, description:String?, greetingText: String?

            for (key1, value:JSON) in subJson {
                switch key1 {
                case "displayName": language = value.string
                case "id": link = value.string
                case "username": description = value.string
                case "mainSkill": greetingText = value.string
                default: break
                }
            }

            let greeting = Greeting(language: language, link: link, description: description, greetingText: greetingText)
            self.greetings.append(greeting)
            self.greetings = self.greetings.filter { $0.link != "\(self.id)"} //this filter
         println(self.id)   //returns nil
        }
    }

    func getGreetingsAsAnyObjects() -> [String: [AnyObject]]{

        return [Constant.GreetingOBJHandlerSectionKey: greetings.map { $0 as AnyObject }]
    }
}

Alamofire请求异步运行,因此init函数末尾的
println
语句在
responseJSON
闭包末尾的
println
语句之前运行。解决方法是运行需要
responseJSON
闭包中的
json
变量的代码。

虽然人们的评论很好地解释了您的问题所在,但我认为应该使用闭包创建一个函数来处理您的请求,然后在完成处理程序中处理其余部分可以帮助您组织代码,如下所示:

func getJSON(url: String, completionHandler: (json: JSON?, error: NSError?) -> ()) {

    Alamofire.request(.GET, url)
        .responseJSON { (req, res, data, error) in completionHandler(
            json: {

                if let d = data {
                    var parse = JSON(d)
                    return parse
                }

                return nil
            }(), error: error)
    }
}
init(filename: String) {

    self.getJSON("http://localhost:2403/users") { json, error in
        if(error != nil) {
            NSLog("Error: \(error)")
        }
        else {
            self.id = json["id"]

            let filePath = NSURL(string: "http://localhost:2403/users")
            let jsonData = NSData(contentsOfURL:filePath!)
            let json = JSON(data: jsonData!, options: NSJSONReadingOptions.AllowFragments, error: nil)

            for (key: String, subJson: JSON) in json {

              var language:String?, link: String?, description:String?, greetingText: String?

              for (key1, value:JSON) in subJson {
                switch key1 {
                case "displayName": language = value.string
                case "id": link = value.string
                case "username": description = value.string
                case "mainSkill": greetingText = value.string
                default: break
              }
            }

            let greeting = Greeting(language: language, link: link, description: description, greetingText: greetingText)
            self.greetings.append(greeting)
            self.greetings = self.greetings.filter { $0.link != "\(self.id)"} //this filter
            println(self.id)
        }
    }
} 
然后您可以通过以下方式调用
init

func getJSON(url: String, completionHandler: (json: JSON?, error: NSError?) -> ()) {

    Alamofire.request(.GET, url)
        .responseJSON { (req, res, data, error) in completionHandler(
            json: {

                if let d = data {
                    var parse = JSON(d)
                    return parse
                }

                return nil
            }(), error: error)
    }
}
init(filename: String) {

    self.getJSON("http://localhost:2403/users") { json, error in
        if(error != nil) {
            NSLog("Error: \(error)")
        }
        else {
            self.id = json["id"]

            let filePath = NSURL(string: "http://localhost:2403/users")
            let jsonData = NSData(contentsOfURL:filePath!)
            let json = JSON(data: jsonData!, options: NSJSONReadingOptions.AllowFragments, error: nil)

            for (key: String, subJson: JSON) in json {

              var language:String?, link: String?, description:String?, greetingText: String?

              for (key1, value:JSON) in subJson {
                switch key1 {
                case "displayName": language = value.string
                case "id": link = value.string
                case "username": description = value.string
                case "mainSkill": greetingText = value.string
                default: break
              }
            }

            let greeting = Greeting(language: language, link: link, description: description, greetingText: greetingText)
            self.greetings.append(greeting)
            self.greetings = self.greetings.filter { $0.link != "\(self.id)"} //this filter
            println(self.id)
        }
    }
} 
使用上面的代码,您可以使用闭包来确保您的请求已完成


我希望这对你有所帮助。

你所有的建议都是有效的,但这才是真正有效的

import Foundation
import Alamofire

class GreetingObjectHandler {
    var greetings: [Greeting] = []

    init(filename: String) {

        let fileP = NSURL(string: "http://localhost:2403/users/me")
        let jsonD = NSData(contentsOfURL:fileP!)
        let jso = JSON(data: jsonD!, options: NSJSONReadingOptions.AllowFragments, error: nil)
        var id = jso["id"]


        let filePath = NSURL(string: "http://localhost:2403/users")
        let jsonData = NSData(contentsOfURL:filePath!)
        let json = JSON(data: jsonData!, options: NSJSONReadingOptions.AllowFragments, error: nil)

        for (key: String, subJson: JSON) in json {

            var language:String?, link: String?, description:String?, greetingText: String?

            for (key1, value:JSON) in subJson {
                switch key1 {
                case "displayName": language = value.string
                case "id": link = value.string
                case "username": description = value.string
                case "mainSkill": greetingText = value.string
                default: break
                }
            }

            let greeting = Greeting(language: language, link: link, description: description, greetingText: greetingText)
            self.greetings.append(greeting)
            self.greetings = self.greetings.filter { $0.link != "\(id)"}
        }
    }

    func getGreetingsAsAnyObjects() -> [String: [AnyObject]]{

        return [Constant.GreetingOBJHandlerSectionKey: greetings.map { $0 as AnyObject }]
    }
}

request()是一个异步操作。如果不添加诸如println(“1(self.if)”)之类的内容,就无法知道首先调用哪一行。它返回nil,因为它在主线程上运行,请求操作尚未成功完成,无法为id属性赋值。它没有通过。@SatnamSync“它没有通过”是什么意思