簡體   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