使用播放/暂停应用程序跳舞,让您的生活更轻松…

DispatchSource使调试变得容易,在运行时分析视图更改,对象状态更改。

在这里,我将描述一种随时随地(运行时)更改对象状态的方法。 我们可以使用断点从调试器更改对象状态。
但是,断点仅在应用于要执行的代码时才能停止执行。 但是,如果我们必须随时随地进行此操作,那么我们就不能依赖于自定义代码的断点。

解决此问题的方法之一就是使用DispatchSourceSignal

我们大多数人都知道DispatchQueue,Qos类,使用DispatchGroup等。
但是我们并不十分了解DispatchSource提供的api和功能。

从Apple Doc:

DispatchSource提供了一个接口,用于监视低级系统对象(例如Mach端口,Unix描述符,Unix信号和VFS节点)的活动,并在发生此类活动时提交事件处理程序以分派队列以进行异步处理。

因此,让我们看一下这种信号监视如何使我们能够随时随地更改对象状态,这在调试过程中会非常方便。

该信号应在应用程序的调试模式下使用,以阻止您的应用程序在生产环境中的洞察力,并保护您的应用程序免受攻击者的侵害。

该代码将很快,所以我假设所有人都知道迅速的基本语法,尽管ObjectiveC中也提供了相同的api,所以让我知道是否需要知道。

让我们添加一个全局属性声明以在传递的对象上启动信令。
对于我的用例。 我在类声明上方添加此属性。

通过viewDidLoad设置信号,如下所示:

  _ = setupSignalHandlerFor(自己) 

方法说明逐步

  1. 如前所述,我们将仅在调试模式下进行此设置。
  2. 我们声明一个可选的源信号参数。
  3. 启动信号以监视主队列上的SIGSTOP Unix信号。
  4. 当收到信号时会添加事件处理程序。
  5. 源以挂起状态开始,因此可以通过调用resume来启动

现在,我们为Unix Signal设置了信令,可以用来更改对象状态,正确..

您是否在问同样的问题,如何用于更新对象状态?

让我们解开谜团

现在,以调试模式运行您的应用,并设置信号发送。 使用此处提供的控件暂停应用,然后再次播放。

再次播放它将击中您的信号,并且您的日志语句将被打印。

现在,如果将断点放在打印语句上,则可以通过暂停和播放来拦截应用程序中任何位置的执行。

现在看看我如何用它来更改对象状态。

在调试器中编写:

  宝物 

将打印“ ””
因此,这意味着对象是我们的控制器实例,并且其属性可以更改。

例如,切换按钮的隐藏状态。

  expr object.searchButton.isHidden = false 

Xcode调试器有时可能无法直接对对象实例进行更改。 在这种情况下,我们必须声明一个指向对象的调试变量,如下所示:

  expr let $ vc = unsafeBitCast(0x7fb43d40fbf0,to:YourModule.ControllerName.self) 

然后您的更改将起作用:

  expr $ vc.searchButton.isHidden = false 

现在,当您播放应用程序时,您可以看到searchButton神奇地出现了。

简而言之:现在,我们可以随时通过暂停,播放和从调试器进行更改来更改对象状态。

用例:由于我们可以随时更改对象属性,因此它就像一把魔杖。 您可以将其用于任何所需的扩展,我一直在将其用于后续更改,并且有兴趣知道您如何使用它以及它为您节省了多少时间,因为您不再需要一次又一次地运行应用程序经过这样的改变🙂

  1. 用户界面随动态数据而变化。
  2. 流量的变化取决于不同的状态。
  3. 不同的UI主题。

它可能用于什么可能并不明显,因此我为一个用例添加了一个简单示例。

例:

我有一个屏幕,其中有一个表示用户数据(名称,性别,年龄)的水平堆栈视图,并且由于这些是动态数据和可选数据,因此任何人都可以为零。
我想检查一下隐藏任何标签时的行为。
一种选择是每次都隐藏/取消隐藏标签来运行它。
但这可能是耗时且令人沮丧的事情,假设我们将屏幕深深地嵌入到应用程序流程中,并且在代码中对其进行更改并一次又一次地运行将需要时间。

第二种选择是使用信号处理程序方法,让我们看看如何使用它以及如何节省我们的时间。

  1. 如上所述,添加信号观察器。
  2. 现在让我们暂停/播放舞蹈。

3.再次播放,我们会得到这个。

4.暂停并反复播放以进行更多更改

5.我们还可以如下进行更多更改(颜色,文本等)

were只需玩暂停/玩游戏,我们就能在一次运行的应用程序中检查所有这些更改。
在这里,我仅描述了一个如何节省我们的时间和精力的示例。
它还可以用于实时检查设计外观。
确实可以证明非常有帮助,尤其是对于动态数据和多个屏幕尺寸。

这是使您的应用适应运行时间更改的小型教程的结尾。
让我知道您如何在应用程序中使用它以及它对您的效果如何。 乐于添加更多用例🙂