iOS Swift: как убрать клавиатуру перед кодом, интенсивно использующим вычисления?

У меня есть представление с текстовым полем, в котором пользователь будет вводить целое число с цифровой клавиатуры.

Затем пользователь нажимает кнопку для расчета.

Вычисление интенсивно использует ЦП и занимает несколько секунд или больше в зависимости от ввода.

Если я попытаюсь отклонить клавиатуру до запуска кода, она не будет отклонена — код запускается первым. (пример кода ниже)

Требуется ли фоновый поток для этого кода для работы отключения клавиатуры?

@IBOutlet weak var numberField: UITextField!

@IBAction func runCPUIntensiveCode(_ sender: UIButton) {
    numberField.resignFirstResponder()
    runCode()
}

person bigswifty    schedule 26.10.2017    source источник
comment
Кажется, работает для меня. У вас есть несколько текстовых полей?   -  person NSAdi    schedule 26.10.2017
comment
Куча ярлыков, но только 1 текстовое поле. Вы написали код, выполнение которого занимает несколько секунд?   -  person bigswifty    schedule 26.10.2017
comment
Нет, но сначала следует отключить клавиатуру. Отключается ли клавиатура после запуска кода?   -  person NSAdi    schedule 26.10.2017
comment
@NSAdi Да, это так.   -  person bigswifty    schedule 26.10.2017


Ответы (1)


Я думаю, у вас есть пара решений с DispatchQueue:
1. [Я рекомендую this] Переместите свои вычисления в фоновый режим через одну из глобальных фоновых очередей:

@IBAction func runCPUIntensiveCode(_ sender: UIButton) {
    numberField.resignFirstResponder()
    DispatchQueue.global(.userInitiated).async{

      runCode()
    DispatchQueue.main.async{
      <notify UI about completion>
   }
}

2. Начать расчет с небольшой задержкой. Иногда подсистеме анимации требуется свободный основной поток для планирования анимации:

@IBAction func runCPUIntensiveCode(_ sender: UIButton) {
    numberField.resignFirstResponder()
    DispatchQueue.main. asyncAfter(DispatchWallTime.distantFuture){
      runCode()
      <notify UI about completion>
   }
}
person Andrew Romanov    schedule 26.10.2017
comment
Ok. В любом случае планировал переместить код в фоновый режим, чтобы показать счетчик. Просто попросил уточнить, что в данном случае нужна многопоточность. - person bigswifty; 26.10.2017
comment
Вы можете выбрать соответствующую очередь, исходя из вашей задачи. Подумайте о качестве обслуживания (developer.apple.com/documentation/dispatch/dispatchqos) и выберите соответствующую очередь. - person Andrew Romanov; 26.10.2017
comment
В этом случае используется .utility QOS с DispatchWorkItem. Все готово :-] - person bigswifty; 27.10.2017