第十七章 @MainActor

0 阅读3分钟

HUDViewModify 封装完毕,我们添加在 LoginPage 主页面上面,首先需要在 LoginViewModel 新增一个 isLoadingHUD 的参数。

image-20211124100041628

LoginPageHUD 添加在最外层。

image-20211124111539600

那么我们在 LoginPageViewModel 中的 login 方法在请求之前开始 HUD,和在请求完毕结束 HUD

image-20211124111841823

但是我们发现一个问题,是我们不注意导致的,我们竟然没有在初始化状态隐藏底部的背景,导致初始化状态就看到一个黑色的背景。

image-20211124112007686

我们修改一个 HUDViewModify 的代码。

image-20211124112120463

@MainActor 在 async 方法更新 UI

这样初始化状态不显示,当需要隐藏 HUD 的时候一起隐藏。我们修改完毕之后,我们测试一下登录功能。

从表面上一切都正常,但是我们看到打印的 Log,发现我们更新UI不在主线程,那么在Release就会导致出问题。

[SwiftUI] Publishing changes from background threads is not allowed; make sure to publish values from the main thread (via operators like receive(on:)) on model updates.

我们在 async 的方法内部怎么回到主线程更新 UI,我们还是用之前的方式更新吗?

image-20211124134144368

也是可以的 ,但是我们出来了 async/await 还这么麻烦吗?大难是否定的,我们有一个 @MainActor 的修饰符。关于 @MainActor 大家可以参考下面的文章了解一下。

hicc.pro/p/swift/the…

image-20211124135406200

image-20211124135534335

通过 @MainActor 装饰我们的 LoginPageViewModel 之后,我们就可以正常通过设置 @Published 值进行更新 SwiftUI 了。

但是我们执行登录请求,虽然也看到加动画和消失动画。对于用户来说,也不知道这次登录时是成功还是失败。虽然可以通过登录成功进入首页做到这一点,但是请求接口完毕做一个提示还是好的。

修改支持提示纯文本

我们修改一下 HUDView 允许可以显示提示的文本,修改的代码如下。

image-20211124141127976

但是我们显示 UI 发生了变化,结果成为了下面显示的样子。

image-20211124141227926

调整 HUD 大小等于内容大小

这和我们预想的不一样,我们预想的不管组件多大,我们都会在最外层添加一个 Padding,并且设置大小为 Fit 的大小。

我们想到我们设置地步黑色区域为宽度和高度相等,现在中间的文件是宽度大于高度,所以按照等比。那么背景大小宽度就等于高度,导致这个样子的出现。

image-20211124141715968

我们删掉了上面的代码,界面效果恢复了。

image-20211124141750241

image-20211124141952750

现在是我们的文本比较长,但是当我们显示一个特别短的文本会是怎么样的 UI 呢?

image-20211124142052985

设置最短显示宽度

这个也说的过去,但是总觉得显示宽度太短了,我们想设置最短的宽度为 50。

image-20211124142311548

image-20211124142323980

此时看起来还差不多。

我们就让 LoginPage 的登录操作,报错就提示错误,否则就提示成功。

image-20211124143027508

image-20220104140049059

延时 2 秒消失

但是我们的提示不会消失了,我们设置提示完毕之后延时 2 秒消失。

image-20211124143750584

image-20211124143809099

此时我们已经做到请求完毕提示 2 秒之后消失。