菜鸟教程小白 发表于 2022-12-11 17:48:44

ios - 使用 DispatchQueue.main.async 时调用了两次 segue


                                            <p><p>我正在尝试对新的 ViewController 执行转场,但转场被调用了两次,并且新的 ViewController 出现了两次。<br/>我正在使用对 API 执行 GET 请求的方法检索数据。<br/>该方法使用完成处理程序。 </p>

<pre><code>func getSearchResultsForQuery(_ query: String, completionHandlerForSearchResultsForQuery: @escaping (_ success: Bool, _ error: NSError?) -&gt; Void)
</code></pre>

<p>当方法成功完成时,我的 segue 会根据需要从主队列中调用。 </p>

<p>我已经设置了断点,所以我可以看到发生了什么,并且执行从 performSegue 跳回到检查方法是否成功的条件,然后继续直到第二次调用 segue。 <br/>我尝试了一个纯程序化的segue,但结果是一样的。<br/>我还添加了一个print语句,如果我注释掉segue,print语句只会被调用一次。</p>

<p>我以前多次使用过同样的模式,但从来没有遇到过问题,我只是不知道为什么会这样。<br/>这次我唯一不同的是使用 Swift 3 并使用 DispatchQueue.main.async 而不是 dispatch_async(dispatch_get_main_queue()。<br/><br/>这是给我这个问题的函数:</p>

<pre><code>    @IBAction func search(_ sender: UIButton) {

      let searchQuery = searchField.text

      TIClient.sharedInstance().getSearchResultsForQuery(searchQuery!) { (success, error) in

            if success {
                print(&#34;Food items fetch successful&#34;)
                DispatchQueue.main.async {
                  print(&#34;Perorming segue for food item: \(searchQuery)&#34;)
                  self.performSegue(withIdentifier: &#34;showFoodItems&#34;, sender: self)
                }
            } else {
                print(&#34;error: \(error)&#34;)
            }
      }
}
</code></pre>

<p>编辑:我从来没有发现问题是什么,但完全删除 Storyboard并重新创建它解决了它。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我知道这不是解决此问题的好方法,而且由于声誉低,我无法发表评论,但是如果将整个 if 语句包装在 DispatchQueue.main 中会发生什么?</p>

<pre><code> @IBAction func search(_ sender: UIButton) {

    let searchQuery = searchField.text

    TIClient.sharedInstance().getSearchResultsForQuery(searchQuery!) { (success, error) in
   DispatchQueue.main.async {
       if success {
         print(&#34;Food items fetch successful&#34;)
         self.performSegue(withIdentifier: &#34;showFoodItems&#34;, sender: self)
       } else {
         print(&#34;error&#34;)
       }
   }
}
</code></pre>

<p>这会产生不同的结果还是仍然是相同的结果?检查 Bool 不需要太多的处理能力,所以我不认为将它放在主队列中是一件坏事,但我会这样做来排除故障。抱歉,我不能对此发表评论。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 使用 DispatchQueue.main.async 时调用了两次 segue,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/39962797/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/39962797/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 使用 DispatchQueue.main.async 时调用了两次 segue