【问题标题】:Removing data from array correctly正确从数组中删除数据
【发布时间】:2017-09-02 12:47:25
【问题描述】:

我面临的问题是,我用数据填充了一个数组,当我想稍后删除它时,即使我调用 removeAll(),数组仍然不是空的。

最好查看我的代码以更清楚地了解问题

更新的新代码

  @objc func textFieldDidChange() {

    doSearch()

    if let commentText = commentTextField.text , !commentText.isEmpty {
        sendButton.setTitleColor(UIColor.blue, for: UIControlState.normal)
        sendButton.isEnabled = true
        return
    }

    sendButton.setTitleColor(UIColor.lightGray, for: UIControlState.normal)
    sendButton.isEnabled = false
}


func doSearch() {
    let caption = commentTextField.text

    let words = caption?.components(separatedBy: CharacterSet.whitespacesAndNewlines)

    self.usersSuggestion.removeAll()


    for var word in words! {
        self.usersSuggestion.removeAll()


        if word.hasPrefix("@") {
            word = word.trimmingCharacters(in: CharacterSet.punctuationCharacters)
            self.isCellSelected = true
            self.usersSuggestion.removeAll()
            API.User.suggestUsers(withText: word, completion: { (user) in
            print("closure", word)


                self.usersSuggestion.append(user)
                self.tableView.reloadData()

                print("@", self.usersSuggestion.count)

            })

            self.usersSuggestion.removeAll()
            tableView.reloadData()


        } else {
            self.isCellSelected = false
            self.usersSuggestion.removeAll()
            tableView.reloadData()

        }
        self.usersSuggestion.removeAll()
        tableView.reloadData()
    }



}

我在这里面临的问题是数组,即使我多次调用 removeAll() 方法,也永远不会回到 0。当我有 2 个用户时,链接一个,下次我写一个 @ 我得到2 个用户 + 链接用户(所以他两次)。我可以无限制地做到这一点,只有 2 个现有用户有大约 100 个用户建议。

照片

【问题讨论】:

  • userSuggestions的类型是什么?
  • var usersSuggestion:[UserModel] = []。从一个空数组开始,在我的 doSearch() 函数中填充。

标签: arrays swift firebase-realtime-database


【解决方案1】:

在数组中插入元素后立即打印计数。这将始终给出 1 的计数。

                                       // count was zero
self.hashTags.insert(hashTag, at: 0)   // adding one
print("# = ", self.hashTags.count)     // count is now 1

鉴于 API.user... 函数使用完成处理程序,我假设这发生在单独的线程中或至少异步发生,因此您可能会遇到 UI 显示为空并突然显示一个的情况。

您可能希望以不同的方式构建代码,以更好地区分请求数据和显示(异步获得的)结果。嵌入式完成处理程序往往会产生误导,给人的印象是执行将以其视觉组织的顺序发生。

【讨论】:

  • 我的问题是我使用 usersSuggestion 块对其进行了测试,它确实可以正常工作。当我写@(我正在构建链接主题标签的 Instagram 功能)时,我可以毫无问题地链接用户,当我通过 # 链接时,我可以正确链接主题标签,但如果我再次使用 @ 链接,它仍然显示来自主题标签数组的数据而不是 users 数组,因为 hashtags 数组不为空(它显示最新使用的主题标签)我希望现在更清楚
  • 更具体地说:计数 1 一直被打印出来,即使它前面没有 # 或 @。这只会在我链接一个标签后发生,但不会在链接用户后发生。
  • 为了再次回到你的答案,打印语句甚至通过写空格出现,所以即使附近没有#,计数总是1
  • 不应该在开始循环之前清除两个数组吗?现在,如果您在使用#yyy 之后立即使用@xxx,则不会清除 hashTags 数组,因为在 word.hasPrefix("@") 块中您不会清除 hashTags。
  • 我试过了,你能不能重新检查我的代码,我已经更新了它,只是链接一个用户,没有标签,仍然面临同样的问题,永远无法完全清空数组。
猜你喜欢
  • 2013-10-30
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
相关资源
最近更新 更多