iphone - 防止方法被不同实体同时调用的优雅方式

标签 iphone objective-c ios multithreading cocoa-touch

我有一个方法,someMethod,它在 a) 用户点击 View 和 b) 用户拖动 View 时被调用。在 someMethod 中,有一个 UIView animateWithDuration block 使 View 顶部的工具栏消失,并相应地重置其框架。如果用户点击 View 而不是拖动它,someMethod 将在动画仍在完成时被触发,这不是我想要的行为(简单地取消动画不起作用,因为完成 block 仍然会触发(即使我检查了“完成” bool 值)。考虑到所有因素,我只是不希望在动画仍在进行时触发此方法。

显然,一个简单的解决方案是使用 BOOL 设置手动锁,并且只允许在锁空闲时调用该方法。

我想知道,是否有更优雅的方法来实现这一点?可以使用 GCD 或其他一些库来完成此操作,这样它就更安全了吗?

更新:我确实尝试使用同步,但问题是该方法触发动画,完成,但动画仍在另一个线程上运行。还有其他想法吗?

最佳答案

计时器用完并不意味着或需要辅助线程。您可以控制将计时器安排在哪个线程上。如果您只是在主线程上安排计时器,那么这两件事都会在主线程上发生。

使用@synchronized 的建议实现了给定代码块不为同一对象运行的效果(无论@synchronized 的参数是什么)同时,但这与说它不在两个不同的线程上运行不是一回事。

如果想检测某个方法是否在主线程以外的线程调用,然后分流到主线程,可以使用+[NSThread isMainThread] dispatch_async(dispatch_get_main_queue(), ^{/* 重新调用当前方法 */});.

关于iphone - 防止方法被不同实体同时调用的优雅方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10959537/

相关文章:

iphone - 与 interactivePopGestureRecognizer 一起调整位置

ios - 在 iOS 的 UITableView 中展开/折叠部分

iphone - 从 safari 返回 iPhone 应用程序

iphone - UIView 粘在 UIScrollView 的底部

ios - 如何在 iPhone 上退出 Google+

iphone - 如何在 iOS 中使用 Quartz 2D 模拟 UIPickerView

iphone - 多个按钮可以有一个 socket 吗?

iphone - UIBarButtonItem 外观和 setBackButtonBackgroundImage

ios - 从 NSDictionary 获取 JSON 子元素

iphone - 使用 GHUnit 编译单元测试的架构问题