2016-11-30 7 views
0

У меня есть вопрос, связанный с моим кодом:Дождитесь результата функции асинхронной в прошивкой

func isNotificationsEnabled()->Bool{ 
    var isNotificationEnabled = false 
    center.getNotificationSettings() { (settings) in 
     switch settings.soundSetting{ 
     case .enabled: 
      isNotificationEnabled = true 
      break 
     case .disabled: 
      isNotificationEnabled = false 
      break 

     case .notSupported: 
      isNotificationEnabled = false 
      break 
     } 
    } 

    return isNotificationEnabled 
} 

Эта функция возвращает результат до center.getNotificationSettings() возвращает результаты. Есть ли способ подождать результата center.getNotificationSettings() и синхронизировать эту функцию?

+1

Возможный дубликат [Возврат данных из асинхронного вызова в функции Swift] (http://stackoverflow.com/questions/25203556/returning-data-from-async-call-in-swift- функция) –

+1

Не спрашивайте, расскажите! Используйте асинхронный обработчик завершения. – vadian

ответ

2

Что вы ищете называются Завершение блока в прошивке, Попробуйте это,

func isNotificationsEnabled(completion:@escaping (Bool)->Swift.Void){ 
     var isNotificationEnabled = false 
     center.getNotificationSettings() { (settings) in 
      switch settings.soundSetting{ 
      case .enabled: 
       isNotificationEnabled = true 
       completion(isNotificationEnabled) 
       break 
      case .disabled: 
       isNotificationEnabled = false 
       completion(isNotificationEnabled) 
       break 

      case .notSupported: 
       isNotificationEnabled = false 
       completion(isNotificationEnabled) 
       break 
      } 
     } 
    } 

Usage,

isNotificationsEnabled { (isNotificationEnabled) in 
    debugPrint(isNotificationEnabled)   
} 
-1

Добавить обработчик завершения!

func isNotificationsEnabled(completion: (Bool) ->())->Bool{ 
    var isNotificationEnabled = false 
    center.getNotificationSettings() { (settings) in 
     switch settings.soundSetting{ 
     case .enabled: 
      isNotificationEnabled = true 
      break 
     case .disabled: 
      isNotificationEnabled = false 
      break 

     case .notSupported: 
      isNotificationEnabled = false 
      break 
     } 
    } 

    return isNotificationEnabled 
    completion(isNotificationEnabled) 
} 

А потом называют его

isNotificationEnabled() { isNotificationsEnabled in 
    print(isNotificationsEnabled) 
} 
+1

Нет, вы вызываете 'завершение' _after_ свой оператор' return' (т. Е. Вы никогда туда не попадете). Вы должны (a) изменить определение метода, чтобы больше не возвращать что-либо (учитывая, что у вас теперь есть обработчик завершения); и (b) удалить оператор 'return'. – Rob

+0

Согласовано хорошее место, oops. –

2

Это пример использования блока завершения, он снижается, но имеет такую ​​же функциональность как код:

func isNotificationsEnabled(completion:@escaping (Bool)->()) { 
    center.getNotificationSettings() { (settings) in 
     switch settings.soundSetting { 
     case .enabled: 
      completion(true) 

     default: 
      completion(false) 
     } 
    } 
} 

, который может быть еще более сокращенное до необходимого:

func isNotificationsEnabled(completion:@escaping (Bool)->()) { 
    center.getNotificationSettings() { (settings) in 
     completion (settings.soundSetting == .enabled) 
    } 
} 

Поскольку только случай .enabled возвращает true, используйте default для возврата false во всех остальных случаях. Кстати: В Swift break заявления не нужны.

И называют это:

isNotificationsEnabled { success in 
    if success { 
     print("is enabled") 
    } else { 
     print("is disabled") 
    } 
} 
0

FYI, вы, вероятно, может упростить еще дальше:

func isNotificationsEnabled(completionHandler: @escaping (Bool) -> Void) { 
    center.getNotificationSettings { settings in 
     completionHandler(settings.soundSetting == .enabled) 
    } 
} 

И как другие отметили, что затем вызывается как:

isNotificationsEnabled { enabled in 
    if enabled { 
     print("is enabled") 
    } else { 
     print("is not enabled") 
    } 
} 
Смежные вопросы