2016-11-30 64 views
0

异步函数的结果我有关于我的代码的问题:返回结果等待iOS中

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

你所寻找被称为iOS中完成块, 试试这个,

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 
      } 
     } 
    } 

用法,

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

不,您在'return'声明之后调用'completion'(即,您永远不会到达那里)。您应该(a)将方法定义更改为不再返回任何内容(因为您现在拥有完成处理程序);和(b)删除'return'语句。 – Rob

+0

约定好的地方,哎呀。 –

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

仅供参考,你也许可以进一步简化这个:

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") 
    } 
}