【问题标题】:Unable to change global variable from within function无法从函数内更改全局变量
【发布时间】:2017-10-17 00:46:07
【问题描述】:

我正在尝试从 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 循环中设置全局变量项目吗?如何获得该函数之外的值?我已经尝试了我在 SO 上找到的所有东西,但没有成功。非常感谢任何帮助。

更多信息,这里是我的 httpRequest 函数:

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

【问题讨论】:

  • 这是因为您甚至在 httpRequest 函数调用完成处理程序之前就打印了 self.projects。
  • Hmm.. 那么我怎样才能得到它,以便可以在 ViewDidLoad 中访问项目数组,其中包含正确的数据,以及在其他函数中?
  • 为什么不把你的逻辑放在完成处理程序中?
  • 我试过了,但是数组还是空的。你有一个例子吗?我一定是做错了
  • 了解异步和同步之间的区别。搜索@escaping 函数。

标签: swift alamofire swxmlhash


【解决方案1】:

假设 xml["rss"]["channel"]["item"] 不是 nil...

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
}

【讨论】:

  • 谢谢。我对设置中的内容感到困惑。原来的 func httpRequest?
  • 另外,我接下来要做的将是对 nil 的错误处理 :)
  • 您可以将代码放在您计划在 setup 中使用 self.projects 执行的操作上。通过这样做,您可以确保 self.projects 变量已经分配了一些值。
  • 问题是我正在尝试使用数组中的项目填充 tableview 单元格,因此我无法在 setup 中调用 tableview 函数
  • 为什么不呢?如果你正确设置了你的 tableview 委托和数据源,你可以简单地做一个 tableview.reloadData()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多