【问题标题】:Why is this array clearing为什么这个数组被清除
【发布时间】:2021-10-03 18:14:16
【问题描述】:

我有一个问题,我正在调用一个函数,它附加了一个数组,然后我从中获取了一个随机元素,问题是在调用函数之后,在我可以使用它之前一直被擦除,因此,随机元素请求导致致命错误。

Utilities.getKnockKnockJokes {

            self.previousKnockKnockJoke = self.currentKnockKnockJoke

            print("currentKnockKnockJoke = \(self.currentKnockKnockJoke)")

            self.currentKnockKnockJoke = KnockKnockJokes.knockKnockJokes.randomElement()!

            print("newCurrentKnockKnockJoke = \(self.currentKnockKnockJoke)")

            self.singleServeText.text = self.currentKnockKnockJoke

        }

调用的函数如下:

static func getKnockKnockJokes(completion: @escaping () -> Void) {
        let db = Firestore.firestore()
        let group = DispatchGroup()
        group.enter()
        DispatchQueue.global(qos: .background).async {
            print("countKnockKnockJokes = \(self.countKnockKnockJokes)")
            if self.countKnockKnockJokes == 0 {
                while self.countKnockKnockJokes == 0 {
                    if self.countKnockKnockJokes == 0 {
                        self.countKnockKnockJokes = 1
                        group.leave()
                    }else {
                        print("leaving")
                        group.leave()
                    }
                }
            }else {
                print("skipped")
                group.leave()
            }
        }
        group.notify(queue: .main) {
            db.collection("jokes").document("Knock Knock Jokes").addSnapshotListener { document, error in
                //check for error
                if error == nil {
                    //check if document exists
                    if document != nil && document!.exists {
                        if let JokeNum = document!.get("JokeNum") as? Int {
                            self.countKnockKnockJokes = JokeNum
                            UserDefaults.standard.setValue(JokeNum, forKey: "countKnockKnockJokes")
                            print("KnockKnockJokeNum = \(self.countKnockKnockJokes)")
                        }
                        var count = 1
                        print("count = \(count)/\(self.countKnockKnockJokes)")
                        print("countKnockKnockJoke = \(self.countKnockKnockJokes)")
                        //Utilities.knockKnockJokes.removeAll()
                        KnockKnockJokes.knockKnockJokes.removeAll()
                        for _ in 0...self.countKnockKnockJokes {
                            print("count = \(count)/\(self.countKnockKnockJokes)")
                            if let Joke = document!.get("\(count)") as? String {
                                print("KnockKnockJokeNum = \(self.countKnockKnockJokes)")
                                if Utilities.jokes.contains("\(Joke) - From Knock Knock Jokes") {}else {
                                    print("Joke = \(Joke)")
                                    Utilities.jokes.append("\(Joke) - From Knock Knock Jokes")
                                    KnockKnockJokes.knockKnockJokes.append(Joke)
                                    print("KnockKnockJokes = \(KnockKnockJokes.knockKnockJokes)")
                                    UserDefaults.standard.set(KnockKnockJokes.knockKnockJokes, forKey: defaults.knockKnockJokes.rawValue)
                                    Utilities.updateJokesDefaults()
                                }
                                print("countKnockKnockFinal = \(count)/\(self.countKnockKnockJokes)")
                                if count == self.countKnockKnockJokes {
                                    completion()
                                }
                                count = count + 1
                            }
                        }
                    }
                }
            }
        }
    }

【问题讨论】:

  • 您的包含KnockKnockJokes.knockKnockJokes.append(Joke) 的IF 语句是否在实际执行?尝试在那里设置断点并检查它。也尝试包装KnockKnockJokes.knockKnockJokes.append(Joke)。进入DispatchQueue.main.async {},这样你就可以确定附加数组发生在主线程而不是后台线程上。
  • 请注意,通过打印,我已经确定它是被追加然后清除的。

标签: arrays swift uikit


【解决方案1】:

我修复了它,我的 remove all 在所有附加之后运行。

【讨论】:

    【解决方案2】:

    试试这个:

    if count == self.countKnockKnockJokes {
        completion()
        return   // <--- here
    }
    

    【讨论】:

    • 不幸的是,这不起作用。还有其他想法吗?如果需要我也可以链接整个项目自己尝试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多