2015-08-24 31 views
-1

我正在使用Alamofire来解析JSON数据。在下面提到的代码中,除了'var id:JSON?'之外,一切工作都正常。虽然它的更新很好,但它在某个点(底部)保持返回零。我需要把这个变量放在过滤器关闭中。变量不断返回零 - Swift iOS

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

request()是一个异步操作。你不能知道哪一行首先被调用,而不会像println(“1 \(self.if)”)那样添加一些东西给它们。 –

+2

它返回nil,因为它在主线程上运行并且请求操作还没有成功完成,值的id属性。 –

回答

-3

所有的建议都是有效的,但这是实际工作的。

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

Alamofire请求异步运行,因此在初始化函数的末尾println声明在responseJSON封尾的println语句之前运行。修复此问题的方法是运行需要responseJSON闭包中的json变量的代码。

2

虽然人们的意见很好地解释了您的问题,但我认为使用闭包处理您的请求然后在完成处理程序中处理其余部分可以帮助您组织代码,类似于以下列方式:

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拨打:

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

与上面的代码,你利用闭包来确定的,您的要求为c ompleted。

我希望这对你有所帮助。

+1

它没有经过。 –

+2

@SatnamSync你的意思是“它没有经过” –