如何将变量的值设置为从 Alamofire 收到的数据?
Posted
技术标签:
【中文标题】如何将变量的值设置为从 Alamofire 收到的数据?【英文标题】:How do I set a variable's value to data I received from Alamofire? 【发布时间】:2016-11-05 02:34:12 【问题描述】:我有一个函数可以获取JSON格式的电影列表,如下:
var size: Int = 0
func getMovies()
Alamofire.request(.GET, "https://api.themoviedb.org/3/discover/movie", parameters: ["sort_by" : "popularity", "api_key" : "secret api key"])
.validate()
.responseJSON response in
switch response.result
case .Success:
self.json = JSON(response.result.value!)
self.arraySize = self.json["results"].count
for num in 0...self.arraySize - 1
let x = self.json["results"][num]["popularity"]
self.movieArray.append(x.double!)
self.movieArray.sortInPlace()
for num in 0...self.arraySize - 1
let path = NSIndexPath(forRow: num, inSection: 0)
let cell = self.tableView.cellForRowAtIndexPath(path)
cell?.textLabel?.text = (self.findMovieByPopularity(self.movieArray[num]) + ": " + String(self.movieArray[num]))
size = self.json["results"].count
case .Failure(let error):
print(error)
在case .Success:
的末尾,我尝试将我在函数外部声明的变量size
设置为JSON 中一个属性的长度。但是,当我在 switch 之外使用这个变量时,它的值仍然是 0。
如何将size
设置为属性的长度,并且还能够在函数之外使用它?
【问题讨论】:
这是一个异步响应。直到响应完成后才设置大小。在该语句上设置断点以确保正确设置它。如果它仍然为零,那么结果可能不正确。但是你的代码很好。但是,我会使用 [unowned self] 或 [weak self] 将 self 传递到闭包中以防止保留循环。 在线程中的哪个类别下检查值是否设置正确? Size 设置为实例属性,对吧?然后你可以使用 self.size 设置它,它将在函数之外可用。您可以通过在该语句本身上添加断点来仔细检查它 您可以尝试在完成处理程序中返回它并在那里使用它,以便在异步调用完成时获得大小的值。 【参考方案1】:添加一个完成处理程序并在闭包中分配值,如下所示:
func getMovies(completion: (aSize: Int) -> ())
let someSize: Int!
//your code
case .Success:
//your code
let x = self.json["results"][num]["popularity"]
self.movieArray.append(x.double!)
someSize = self.json["results"].count
completion(aSize: someSize)
//your code
然后当你想在其他函数调用中调用它时:
getMovies numSize in
self.size = numSize
【讨论】:
这不太行。当我调用 getMovies 时,我不能在括号外使用size
,因为它仍然为 0。尽管当我在括号内 print(size)
时,它应该是 20。 (问题是我需要在函数中返回size
的值。
var size
是一个 global
变量,正如您在此处的代码中所写的那样,对吗?它被初始化为 0。当Alamofire
完成获取数据时,您会像我向您展示的那样更新它。你试过这个吗?打印出来的时候还是0吗?
'getMovies numSize in self.size = numSize print(self.size) print(size)' 这是我运行调用 getMovies() 的代码,括号内的“打印”打印20 而括号外的打印 0。
输出是什么? 0?
是的,括号内的 size 值似乎只有 20。 (顺便感谢大家的支持。)以上是关于如何将变量的值设置为从 Alamofire 收到的数据?的主要内容,如果未能解决你的问题,请参考以下文章
将 DateTimePicker 时间格式值设置为从数据库 VB.NET 返回的值
如何使用Alamofire Router来组织API调用?(swift Alamofire5)