当前位置:  开发笔记 > IOS > 正文

代码只能在DispatchQueue.main.async块中运行,为什么?

如何解决《代码只能在DispatchQueue.main.async块中运行,为什么?》经验,为你挑选了1个好方法。

我编写此代码以在用户开始编辑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()这是结果:

{number = 1, name = main}

所以看起来它已经在主线程上被触发了,但代码仍然无法工作,除非textfield.selectAll()DispatchQueue.main.async块内部调用.



1> matt..:

你的呼叫的真正效果DispatchQueue.main.async是增加一点微小的延迟.特别是,这种延迟足够长,足以让当前的runloop完成并启动下一个runloop.onEditingBegin因此,允许完成导致事件发送给您的操作,即调用.文本字段现在正在编辑,因此我们准备好进行下一步,即选择其内容.

你发现的技巧实际上是iOS编程中经常需要的东西.Cocoa是一个复杂的框架,界面的操作有时可能会绊倒彼此的脚,就像这里一样 - 当用户开始在文本字段中编辑时,您试图选择文本字段的文本.有时我们只需要runloop再次出现,以便在继续下一步之前允许界面"安定下来".

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有