无法使用我在 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

那么,与其分开 eventDetailsregids 数组,不如使用一个事件数组:

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 在堆中分配的内存块的大小?

在 C++ 中清除堆栈中分配的内存

为 Excel 堆积条形图的点着色与表中分配的值相关

由 malloc 在 C 中分配的大小的意外输出 [关闭]

在Bundle中传递多个值,在最后一个字符串中分配的值被传递给所有字符串

Azure密钥保管库如何识别访问策略中分配的不同身份