2017-10-17 127 views
0

我想一个全局变量从alamofire变量中改变内改变,但我有问题这样做。这里是我的代码:无法全局变量从功能

var projects = [[String]]() 
var xmlToParse = String() 
var postTitle = String() 
var postLink = String() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    httpRequest("https://www.hello.com/feed") { response in 
     self.xmlToParse = response as String 
     let xml = SWXMLHash.parse(self.xmlToParse) 

     for elem in xml["rss"]["channel"]["item"].all { 
      self.postTitle = elem["title"].element!.text 
      self.postLink = elem["link"].element!.text     
      self.projects.append([self.postTitle, self.postLink]) 
     } 
    } 
    print(self.projects) 
} 

当我在这里打self.projects,我得到一个空数组,但是当我打印出来的HttpRequest的功能我得到正确的数据内。我是不是在for循环中设置全局变量项目?我怎样才能获得该功能以外的价值?我尝试了所有我发现的一切,但没有成功。任何帮助是极大的赞赏。

只是为了更多的信息,这里是我的HttpRequest功能:

func httpRequest(_ section: String, completion: @escaping (String) -> Void) { 
    Alamofire.request(section, method: .get).responseString { response in 
     completion(response.result.value!) 
    } 
} 
+2

这是因为即使在httpRequest函数调用完成处理程序之前您正在打印self.projects。 – koropok

+0

嗯..那么我怎样才能得到它,这样的项目数组可以访问ViewDidLoad中的适当的数据,以及在其他功能? –

+0

为什么不把你的逻辑放在完成处理程序中? – koropok

回答

1

假设XML [ “RSS”] [ “通道”] [ “项目”]不是零...

override func viewDidLoad() { 
    super.viewDidLoad() 

    httpRequest("https://www.hello.com/feed") { response in 
     self.xmlToParse = response as String 
     let xml = SWXMLHash.parse(self.xmlToParse) 

     for elem in xml["rss"]["channel"]["item"].all { 
      self.postTitle = elem["title"].element!.text 
      self.postLink = elem["link"].element!.text     
      self.projects.append([self.postTitle, self.postLink]) 
     } 

     self.setup() 
    } 
} 

func setup() { 
    // Your logic here 
} 
+0

感谢这个可能的重复。我很困惑安装过程中发生了什么。原始函数httpRequest? –

+0

另外,我正在做的下一件事情将是无错误处理:) –

+0

您可以将代码放在您计划在setup中使用self.projects执行的操作。通过这样做,您可以确保self.projects变量已被赋值为某个值。 – koropok