在计时器完成块中不更新变量

时间:2019-11-10 06:59:40

标签: swift timer updates completion

这是场景:

我想在显示页面后滚动(或摇动)水平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”在类中可以很好地更新,但在计时器完成时始终为false! 这意味着“ collectionDidScroll”尚未完成更新,并且具有其启动时间值。

通知:

我的课程是UICollectionViewCell的子类

我什至尝试使用带有计时器的计时器和带有完成块的计时器来调度队列,但是结果是相同的

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

问题已解决!

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

谢谢大家。