Обновление пользовательского интерфейса после получения настроек устройства - PullRequest
0 голосов
/ 14 мая 2018

Я хочу сделать что-то простое в Swift. Я должен получить некоторые настройки с устройства, а затем инициализировать некоторые элементы управления пользовательского интерфейса с этими настройками. Для завершения поиска может потребоваться несколько секунд, поэтому я не хочу, чтобы код продолжался до окончания поиска (асинхронный).

Я прочитал множество постов на многих сайтах, включая этот, и прочитал много уроков. Никто, кажется, не работает для меня.

Кроме того, в интересах инкапсуляции я хочу сохранить детали в объекте устройства.

Когда я запускаю приложение, я вижу печать из метода инициализации, прежде чем я вижу печать из метода.

// Initializing method

brightnessLevel = 100
device.WhatIsTheBrightnessLevel(level: &brightnessLevel)
print("The brightness level is \(brightnessLevel)")


// method with the data retrieval code

func WhatIsTheBrightnessLevel(level brightness: inout Int) -> CResults
{
var brightness: Int
var characteristic: HMCharacteristic
var name: String
var results: CResults
var timeout: DispatchTime
var timeoutResult: DispatchTimeoutResult



// Refresh the value by querying the lightbulb
name = m_lightBulbName
characteristic = m_brightnessCharacteristic!
brightness = 100
timeout = DispatchTime.now() + .seconds(CLightBulb.READ_VALUE_TIMEOUT)
timeoutResult = .success
results = CResults()
results.SetResult(code: CResults.code.success)
let dispatchGroup = DispatchGroup()
DispatchQueue.global(qos: .userInteractive).async
  {
  //let dispatchGroup = DispatchGroup()
  dispatchGroup.enter()
  characteristic.readValue(completionHandler:
    { (error) in
      if error != nil
        {
        results.SetResult(code: CResults.code.homeKitError)
        results.SetHomeKitDescription(text: error!.localizedDescription)
        print("Error in reading the brightness level for \(name): \(error!.localizedDescription)")
        }
       else
          {
          brightness = characteristic.value as! Int
          print("CLightBulb: -->Read the brightness level.  It is \(brightness) at " + Date().description(with: Locale.current))
          }
      dispatchGroup.leave()
    })
    timeoutResult = dispatchGroup.wait(timeout: timeout)
    if (timeoutResult == .timedOut)
      {
      results.SetResult(code: CResults.code.timedOut)
      }
     else
        {
        print("CLightBulb: (After wait) The brightness level is \(brightness) at " + Date().description(with: Locale.current))
        self.m_brightnessLevel = brightness
        }
  }
return(results)
}



Thank you!

1 Ответ

0 голосов
/ 16 мая 2018

Если вы собираетесь обернуть асинхронную функцию своей собственной функцией, обычно лучше предоставить вашей функции-обертке также обработчик завершения. Обратите внимание на вызов вашего обработчика завершения. Вот где вы должны передать полученные значения (т. Е. В замыкании):

func getBrightness(characteristic: HMCharacteristic, completion: @escaping (Int?, Error?) -> Void) {

    characteristic.readValue { (error) in

        //Program flows here second

        if error == nil {
            completion(characteristic.value as? Int, nil)
        } else {
            completion(nil, error)
        }
    }

    //Program flows here first
}

Затем, когда вы вызываете свою функцию, вам просто нужно убедиться, что вы обрабатываете результаты в обработчике завершения (то есть закрытии):

getBrightness(characteristic: characteristic) { (value, error) in

    //Program flows here second

    if error == nil {
        if let value = value {
            print(value)
        }
    } else {
        print("an error occurred: \(error.debugDescription)")
    }
}

//Program flows here first

Всегда имейте в виду, что код будет проходить до завершения асинхронной функции. Поэтому вы должны структурировать свой код так, чтобы все, что зависит от возвращаемого значения или ошибки, не выполнялось до завершения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...