使用播放/暂停应用程序跳舞,让您的生活更轻松…
DispatchSource使调试变得容易,在运行时分析视图更改,对象状态更改。
在这里,我将描述一种随时随地(运行时)更改对象状态的方法。 我们可以使用断点从调试器更改对象状态。
但是,断点仅在应用于要执行的代码时才能停止执行。 但是,如果我们必须随时随地进行此操作,那么我们就不能依赖于自定义代码的断点。
解决此问题的方法之一就是使用DispatchSourceSignal
我们大多数人都知道DispatchQueue,Qos类,使用DispatchGroup等。
但是我们并不十分了解DispatchSource提供的api和功能。
从Apple Doc:
DispatchSource提供了一个接口,用于监视低级系统对象(例如Mach端口,Unix描述符,Unix信号和VFS节点)的活动,并在发生此类活动时提交事件处理程序以分派队列以进行异步处理。
因此,让我们看一下这种信号监视如何使我们能够随时随地更改对象状态,这在调试过程中会非常方便。
该信号应在应用程序的调试模式下使用,以阻止您的应用程序在生产环境中的洞察力,并保护您的应用程序免受攻击者的侵害。
该代码将很快,所以我假设所有人都知道迅速的基本语法,尽管ObjectiveC中也提供了相同的api,所以让我知道是否需要知道。
让我们添加一个全局属性声明以在传递的对象上启动信令。
对于我的用例。 我在类声明上方添加此属性。
通过viewDidLoad设置信号,如下所示:
_ = setupSignalHandlerFor(自己)
方法说明逐步
- 如前所述,我们将仅在调试模式下进行此设置。
- 我们声明一个可选的源信号参数。
- 启动信号以监视主队列上的
SIGSTOP
Unix信号。 - 当收到信号时会添加事件处理程序。
- 源以挂起状态开始,因此可以通过调用
resume
来启动
现在,我们为Unix Signal设置了信令,可以用来更改对象状态,正确..
您是否在问同样的问题,如何用于更新对象状态?
让我们解开谜团
现在,以调试模式运行您的应用,并设置信号发送。 使用此处提供的控件暂停应用,然后再次播放。
再次播放它将击中您的信号,并且您的日志语句将被打印。
现在,如果将断点放在打印语句上,则可以通过暂停和播放来拦截应用程序中任何位置的执行。
现在看看我如何用它来更改对象状态。
在调试器中编写:
宝物
将打印“ ””
因此,这意味着对象是我们的控制器实例,并且其属性可以更改。
例如,切换按钮的隐藏状态。
expr object.searchButton.isHidden = false
Xcode调试器有时可能无法直接对对象实例进行更改。 在这种情况下,我们必须声明一个指向对象的调试变量,如下所示:
expr let $ vc = unsafeBitCast(0x7fb43d40fbf0,to:YourModule.ControllerName.self)
然后您的更改将起作用:
expr $ vc.searchButton.isHidden = false
现在,当您播放应用程序时,您可以看到searchButton神奇地出现了。
简而言之:现在,我们可以随时通过暂停,播放和从调试器进行更改来更改对象状态。
用例:由于我们可以随时更改对象属性,因此它就像一把魔杖。 您可以将其用于任何所需的扩展,我一直在将其用于后续更改,并且有兴趣知道您如何使用它以及它为您节省了多少时间,因为您不再需要一次又一次地运行应用程序经过这样的改变🙂
- 用户界面随动态数据而变化。
- 流量的变化取决于不同的状态。
- 不同的UI主题。
它可能用于什么可能并不明显,因此我为一个用例添加了一个简单示例。
例:
我有一个屏幕,其中有一个表示用户数据(名称,性别,年龄)的水平堆栈视图,并且由于这些是动态数据和可选数据,因此任何人都可以为零。
我想检查一下隐藏任何标签时的行为。
一种选择是每次都隐藏/取消隐藏标签来运行它。
但这可能是耗时且令人沮丧的事情,假设我们将屏幕深深地嵌入到应用程序流程中,并且在代码中对其进行更改并一次又一次地运行将需要时间。
第二种选择是使用信号处理程序方法,让我们看看如何使用它以及如何节省我们的时间。
- 如上所述,添加信号观察器。
- 现在让我们暂停/播放舞蹈。
3.再次播放,我们会得到这个。
4.暂停并反复播放以进行更多更改
5.我们还可以如下进行更多更改(颜色,文本等)
were只需玩暂停/玩游戏,我们就能在一次运行的应用程序中检查所有这些更改。
在这里,我仅描述了一个如何节省我们的时间和精力的示例。
它还可以用于实时检查设计外观。
确实可以证明非常有帮助,尤其是对于动态数据和多个屏幕尺寸。
这是使您的应用适应运行时间更改的小型教程的结尾。
让我知道您如何在应用程序中使用它以及它对您的效果如何。 乐于添加更多用例🙂