繁体   English   中英

代码仅在DispatchQueue.main.async块内有效,为什么?

[英]Code only works within a DispatchQueue.main.async block, why?

当用户开始编辑UITextField时,我编写了以下代码来选择所有文本:

@IBAction func onEditingBegin(_ sender: Any) {
    print("editing began")
    let textfield = sender as! UITextField
    textfield.selectAll(nil)
}

但是,直到我将textfield.selectAll(nil)行包含在DispatchQueue.main.async块中之后,它才起作用:

DispatchQueue.main.async {
    textfield.selectAll(nil)
}

这是为什么?

我还在onEditingBegin()打印出了线程的名称,这就是结果:

<NSThread: 0x60800006c880>{number = 1, name = main}

因此,似乎已经在主线程上将其触发,但是除非在DispatchQueue.main.async块内部调用textfield.selectAll()否则代码仍然无法正常工作。

调用DispatchQueue.main.async的真正效果是增加了微小的延迟 特别是,此延迟足够长,足以允许当前运行循环结束并启动下一个运行循环。 因此,允许将事件发送给您的操作(调用onEditingBegin )可以完成 现在,文本字段正在编辑中,因此我们准备好进行下一步,即选择其内容。

您发现的技巧实际上是iOS编程中经常需要的东西。 可可是一个复杂的框架,界面的操作有时可能会绊倒在彼此的脚上,如此处所示-当用户开始在文本字段中进行编辑时,您正在尝试选择文本字段的文本。 有时,我们只需要运行循环再出现一次,以允许接口在进行下一步之前就“解决”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM