Search code examples
swiftalamofire

Variable keeps returning nil - Swift iOS


I'm using Alamofire to Parse JSON data. Everything is working fine in below mentioned code except 'var id: JSON?' variable though it's updating just fine but it keeps returning nil at a point (at bottom). I need to put this variable inside filter closure.

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

Solution

  • All your suggestions were valid but this is what actually worked.

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