【问题标题】:Not able to use the value I assigned inside an Alamofire completion block无法使用我在 Alamofire 完成块中分配的值
【发布时间】: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
}

【问题讨论】:

标签: ios swift alamofire


【解决方案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 的细节,而是关注一个基本思想,即人们通常希望拥有自定义对象的数组,而不是针对对象的各个属性完全独立的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    相关资源
    最近更新 更多