当 NSTimer 启动时会发生什么
What happens when NSTimer kicks in
我有一个 iOS 构造,我从底层 class 获得回调。
此回调对 NSMutablearray 进行更改。
同时我有一个 NSTimer,它回调一个方法,该方法对同一个 NSMutable 数组进行更改。
如果回调 "collide" 与 NSMutablearray 一起工作,我在这里看到一个潜在的问题。
我不知道该如何处理。 NSLock 可以解决这个问题还是我应该将我的 NSMutablearray 实例化为原子?
您应该确保对可变数组的任何更改发生在同一线程上。这将确保不会有 'collisions'。如果你的计时器在主线程上触发,并且你的回调也在主线程上发生,那么一切都很好。
如果计时器和回调在不同的线程上,您可以使用串行 GCD 队列序列化对数组的访问。当你这样做时,对这个数组的任何和所有访问都应该在这个队列上完成(例如在 属性 中保留对这个队列的引用)。
NSLock 可能对你有帮助,但如果你在主线程上工作,这通常不是一个好主意,因为你可能会阻塞主队列,这会影响用户交互/滚动行为。
此外,atomic 仅表示获取或设置 指向数组的指针是线程安全的,即:将返回或设置有效值(但并不意味着它将是正确的 值)。你对它做的任何操作都与 属性 是原子的还是 nonatomox 无关。
我有一个 iOS 构造,我从底层 class 获得回调。 此回调对 NSMutablearray 进行更改。
同时我有一个 NSTimer,它回调一个方法,该方法对同一个 NSMutable 数组进行更改。
如果回调 "collide" 与 NSMutablearray 一起工作,我在这里看到一个潜在的问题。
我不知道该如何处理。 NSLock 可以解决这个问题还是我应该将我的 NSMutablearray 实例化为原子?
您应该确保对可变数组的任何更改发生在同一线程上。这将确保不会有 'collisions'。如果你的计时器在主线程上触发,并且你的回调也在主线程上发生,那么一切都很好。
如果计时器和回调在不同的线程上,您可以使用串行 GCD 队列序列化对数组的访问。当你这样做时,对这个数组的任何和所有访问都应该在这个队列上完成(例如在 属性 中保留对这个队列的引用)。
NSLock 可能对你有帮助,但如果你在主线程上工作,这通常不是一个好主意,因为你可能会阻塞主队列,这会影响用户交互/滚动行为。
此外,atomic 仅表示获取或设置 指向数组的指针是线程安全的,即:将返回或设置有效值(但并不意味着它将是正确的 值)。你对它做的任何操作都与 属性 是原子的还是 nonatomox 无关。