【问题标题】:What happens when NSTimer kicks in当 NSTimer 启动时会发生什么
【发布时间】:2016-04-27 11:11:17
【问题描述】:

我有一个 iOS 结构,我从底层类中获取回调。 此回调对 NSMutablearray 进行更改。

同时,我有一个 NSTimer,它对一个方法进行回调,该方法对同一个 NSMutable 数组进行更改。

如果回调“冲突”与 NSMutablearray 一起使用,我会看到一个潜在的问题。

我不知道如何处理这个问题。 NSLock 可以解决问题还是我应该将我的 NSMutablearray 实例化为原子的?

【问题讨论】:

  • 你在使用多线程吗?如果不是,则在其他代码完成之前,计时器不会触发。直到您的代码下次返回并访问事件循环时,计时器才会触发。
  • 无论您做什么,请记住,单独锁定可能无法解决您的所有问题,即即使对数组的每次访问都被锁定,这也可能不足以使其成为线程安全的。快速示例:需要多次访问数组的较长操作,但数组可能在两者之间发生了变化。

标签: ios nstimer


【解决方案1】:

您应该确保对可变数组的任何更改都发生在同一个线程上。这将确保不会有“碰撞”。如果您的计时器在主线程上触发,并且您的回调也发生在主线程上,那么一切都很好。

如果计时器和回调在不同的线程上,您可以使用串行 GCD 队列序列化对数组的访问。执行此操作时,应在此队列上完成对该数组的任何和所有访问(例如,在属性中保留对该队列的引用)。

NSLock 可能会对您有所帮助,但如果您在主线程上工作,这通常不是一个好主意,因为您可能会阻塞主队列,这会影响用户交互/滚动行为。

此外,原子仅意味着 获取或设置指向数组的指针是线程安全的,即:将返回或设置有效值(dors 并不意味着它将是正确的 值)。您对其执行的任何操作都与原子或非atomox 属性无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 2018-02-06
    相关资源
    最近更新 更多