菜鸟教程小白 发表于 2022-12-11 19:30:07

ios - 从 UITableViewCell 清除 Firebase 观察结果


                                            <p><p>在所有使用 Firebase 的 iOS 类中,您都会有这样的代码,</p>

<pre><code>private func clearObservations() {

    // your method for clearing observations, probably something like
    blah blah. removeAllObservers()
}
</code></pre>

<p>在<strong> ViewController </strong>中,您必须在<code>viewWillDisappear</code>(或<code>viewDidDisappear</code>)中调用它</p>

<pre><code>override func viewWillDisappear(_ animated: Bool) {

    super.viewWillDisappear(animated)
    clearObservations()
}
</code></pre>

<p>没关系。</p>

<p><strong><em>假设</em></strong>您已经在 UITableViewCell 中创建了一个观察。</p>

<p>细胞中“清晰观察”的最佳位置是什么? </p>

<p>注意<code>prepareForReuse</code>没用,试试看。</p>

<p>我们发现的唯一方法是</p>

<pre><code>override func willMove(toSuperview newSuperview: UIView?) {

    if newSuperview == nil {

      clearObservations()
    }
    super.willMove(toSuperview: newSuperview)
}
</code></pre>

<p>虽然看起来很古怪/奇怪。</p>

<p>这是怎么回事?</p>

<h2>更新</h2>

<p>请注意,虽然“XY 答案”很有趣且内容丰富,但如果有人知道该问题的答案,那就太好了!</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><h2>前言</h2>

<p>这是试图回答问题,但问题被误解了。我将把它留在这里,因为它确实与观察者、句柄和 tableView 单元格交互有关。</p>

<hr/>

<p>虽然您<em>可以</em>经历这些回旋,但在大多数用例中并不真正需要。</p>

<p>例如,如果您向节点添加和观察者,则不一定有一个 <em>someRef?</em> 变量。所以在这里我们正在查看帖子节点是否有新帖子</p>

<pre><code>let postsRef = self.ref.child(&#34;Posts&#34;)
postsRef.observe(.childAdded, with: { snapshot in
    print(snapshot) //add the post to the dataSource and reloadTableview/cell
})
</code></pre>

<p>这是另一个监视由 uid_2 更改的任何帖子的示例</p>

<pre><code>let postsRef = self.ref.child(&#34;Posts&#34;)
let queryRef = postsRef.queryOrdered(byChild: &#34;poster_id&#34;).queryEqual(toValue: &#34;uid_2&#34;)
queryRef.observe(.childChanged) { (snapshot) in
    print(snapshot) //change the post in the dataSource and reloadTableview/cell
}
</code></pre>

<p>此功能不需要任何类变量,也不需要任何内容​​。这里的要点是您不必拥有类变量来获得观察功能,并且您不需要为每个观察者保留一个句柄(继续阅读)</p>

<blockquote>
<p>In view controllers, it&#39;s essential that you call this
<em>(someRef?.removeAllObservers())</em> in viewWillDisappear (or Did)..
will use Firebase in the cells of tables.</p>
</blockquote>

<p>澄清;我不想将 Firebase 观察者放在表格的单元格中。观察者应该在控制具有单元格的 tableView 的任何 viewController 中。单元格应从 dataSource 数组(由 Firebase 支持)中提取数据</p>

<p>在某些情况下,您可能希望删除所有观察者,再次不需要类 var 或需要 nil var。</p>

<pre><code>let postsRef = self.ref.child(&#34;Posts&#34;)
postsRef.removeAllObservers()
</code></pre>

<p>有时需要删除特定的观察者(例如,在节点的子节点上有观察者的情况下),在这种情况下,我们存储该观察者的句柄,例如类 var (将它们保存在一个数组中是一种整洁的方法)</p>

<pre><code>class ViewController: UIViewController {
   var myPostHandle : DatabaseHandle?

   func addObserver() {
      let postsRef = self.ref.child(&#34;Posts&#34;)
      self.myPostHandle = postsRef.observe(.childAdded, with: { snapshot in
         print(snapshot)
      })

   func stopObserving() {
      if self.myPostHandle != nil {
         let postsRef = self.ref.child(&#34;Posts&#34;)
         postsRef.removeObserver(withHandle: self.myPostHandle) //remove only the .childAdded observer
      }
   }
}
</code></pre>

<p>同样,一旦观察者被移除,一旦类关闭,句柄就会超出范围。</p>

<p>包含单元格的表格 View 由数据源支持,并且该数据源从 firebase 获取数据。当从 Firebase 添加、更改或删除某些内容时,您的应用会收到通知,并且 <em>array</em> 会更新,然后单元格会刷新。细胞本身不需要观察者。</p>

<p>没有必要添加几十个观察者(在单元格中) - 添加一个中央观察者并让它保持阵列最新。仅在发生变化时刷新 tableView。</p>

<p><strong>编辑</strong></p>

<p>解决有关使用 removeAllObservers 的评论:代码值 1000 字:</p>

<p>使用两个按钮操作创建一个新的 Firebase 项目。这是 button0 的代码,它将观察者添加到节点:</p>

<pre><code>func button0() {   
    let testRef = self.ref.child(&#34;test_node&#34;)
    testRef.observe( .value) { snapshot in
      print(snapshot)
    }
}
</code></pre>

<p>当点击这个按钮0时,从那里开始,对测试节点的任何添加、更改或删除都会将其内容打印到日志中。</p>

<pre><code>func button1() {   
    let testRef = self.ref.child(&#34;test_node&#34;)
    testRef.removeAllObservers()
}
</code></pre>

<p>这将删除指定节点的所有观察者。单击后,控制台不会打印任何事件。</p>

<p>试试吧!</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 从 UITableViewCell 清除 Firebase 观察结果,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/47944673/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/47944673/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 从 UITableViewCell 清除 Firebase 观察结果