计时器完成块中的变量未更新

Variables are not updated in timer completion block

场景如下:

我想在页面显示后滚动(或摇动)水平 collectionView,以便用户可以看到它在滚动...

我在页面弹出 3 秒后没有问题,但我不希望它在用户在 2 秒前到达 collectionView 并自行滚动时跳起舞来。

所以这是我的解决方案:

   var collectionDidScroll = false

   func scrollViewDidScroll(_ scrollView: UIScrollView) {
        collectionDidScroll = true
   }

   override func awakeFromNib() {
        super.awakeFromNib()
        Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(showScrollTutorial), userInfo: nil, repeats: false)
   }

   @objc func showScrollTutorial() {
        if !collectionDidScroll {
            collectionView.shakeCells()
        }
   }

问题:

"collectionDidScroll" 在 class 中更新得很好,但在计时器完成时它总是错误的! 这意味着 "collectionDidScroll" 没有完成更新并且它有它的启动时间值。

注意事项:

我的 class 是 UICollectionViewCell

的子class

我什至试过带计时器的 dispatchQueue 和带完成块的计时器,但结果是一样的

以上评论回答了您的问题,但为了帮助您以后自己解决类似问题:

每当您遇到此类问题时,您应该尝试在代码(尤其是 scrollViewDidScrollshowScrollTutorial)中添加打印语句,以查看它们是否被调用以及它们包含哪些值。或者你可以设置断点!

问题已解决!

我在 'DispatchQueue' 中放置了 'showScrollTutorial()' 函数内容以强制它在主线程中成为 运行,现在它就像一个魅力!

谢谢大家。