无法使用我在 Alamofire 完成块中分配的值
Posted
技术标签:
【中文标题】无法使用我在 Alamofire 完成块中分配的值【英文标题】:Not able to use the value I assigned inside an Alamofire completion block 【发布时间】:2017-01-29 17:26:45 【问题描述】:在这里,我将 eventDetails 中元素数量的值分配给 Alamofire 完成处理程序中的变量 x。但是,我无法在代码的其他地方使用它。我尝试将 x 的值用于 numberofrowsinsection 但它返回 0 尽管它有一个值。
Alamofire.request(some_url, method: .post, parameters: data, encoding: URLEncoding.default, headers: nil).responseJSON
response in
let json = JSON(response.result.value)
for eves in json.arrayValue
self.eventDetails.append(eves["EventName"].stringValue)
self.regids.append(eves["EventRegID"].stringValue)
self.x = self.eventDetails.count
【问题讨论】:
这是重复的(与以前版本的 Alamofire):***.com/a/31498553/1271826 【参考方案1】:请记住,这个完成处理程序闭包是异步运行的(即晚于紧接在闭包之后出现的代码)。在有机会设置之前,您可能正在检查x
。在您的完成处理程序闭包中添加self.tableView.reloadData()
,以便在请求完成时让您的应用重新加载表。
Alamofire.request(some_url, method: .post, parameters: data).responseJSON response in
let json = JSON(response.result.value)
for eves in json.arrayValue
self.eventDetails.append(eves["EventName"].stringValue)
self.regids.append(eves["EventRegID"].stringValue)
self.x = self.eventDetails.count
self.tableView.reloadData()
【讨论】:
上面的代码存在于 viewdidload() 中,那么我应该把 self.tableview.reloadData() 放在哪里呢?我是 ios 应用开发新手,所以请多多包涵。 把它放在responseJSON
的完成处理闭包中。我在上面添加了代码 sn-p。
谢谢 Rob,你拯救了我的一天。
没问题。如果我回答了您的问题,请考虑接受我的回答。见What should I do when someone answers my question?【参考方案2】:
顺便说一句,与您手头的问题完全无关,您可能希望使用自定义类型来捕获这些详细信息:
struct Event
let name: String
let regId: String
那么,与其分开 eventDetails
和 regids
数组,不如使用一个事件数组:
var events = [Event]()
这更准确地捕获了实际模型(您正在处理一组事件,而不是完全不相关的名称和标识符数组)。它还启用某些功能。例如,假设您的事件是按时间顺序返回的,并且您希望按字母顺序对它们进行排序,如果您将与单个事件关联的所有详细信息封装到自定义类型中,那么在排序时,整个对象将被排序并且您不必担心如何使这些不同的数组保持同步。
无论如何,当使用自定义类型时,responseJSON
可能看起来像:
Alamofire.request(some_url, method: .post, parameters: data).responseJSON response in
let json = JSON(response.result.value)
for eves in json.arrayValue
let event = Event(name: eves["EventName"].stringValue, regId: eves["EventRegID"].stringValue)
self.events.append(event)
self.tableView.reloadData()
我还想取消x
的使用,因为这只是另一个可能与该数组不同步的变量。只需让numberOfRowsForSection
直接返回events.count
。
现在,我在没有通过编译器运行的情况下输入了上面的内容,所以如果我引入了任何拼写错误,我深表歉意。但我不希望您关注我的代码 sn-ps 的细节,而是关注一个基本思想,即人们通常希望拥有自定义对象的数组,而不是针对对象的各个属性完全独立的数组。
【讨论】:
以上是关于无法使用我在 Alamofire 完成块中分配的值的主要内容,如果未能解决你的问题,请参考以下文章
为啥 C 中没有“memsize”,它返回使用 malloc 在堆中分配的内存块的大小?