解决此问题的一种方法是将闭包(通常称为a
completionHandler)传递给您的
siteInfo函数,然后在
Alamofire.request闭包中调用该闭包:
func siteInfo(completionHandler: (String?, NSError?) -> ()) -> () { Alamofire.request(.GET, MY_API_END_POINT).responseJSON { (request, response, JSON, error) in let info = JSON as? NSDictionary // info will be nil if it's not an NSDictionary let str = info?["access_key"] as? String // str will be nil if info is nil or the value for "access_key" is not a String completionHandler(str, error) }}
然后这样称呼它(不要忘记错误处理):
siteInfo { (str, error) in if str != nil { // Use str value } else { // Handle error / nil value }}
在您要求的评论中:
因此,如果您只能在闭包内部进行 *** 作而不影响闭包外部的对象,那么如何保存从get请求中收集的信息?另外,如何跟踪知道请求何时完成?
您可以将get请求的结果从闭包内部保存到类的实例变量中;封闭并没有阻止您执行此 *** 作。从那里开始,您的 *** 作实际上取决于您要对这些数据进行的 *** 作。
一个例子呢?由于看起来您正在获取用于获取请求的访问密钥表单,因此您可能需要使用该表单来将来在其他功能中提出请求。
在这种情况下,您可以执行以下 *** 作:
注意: 异步编程是一个巨大的话题。太多了,无法涵盖在这里。这只是如何处理从异步请求中获取的数据的一个示例。
public class Site { private var _accessKey: String? private func getAccessKey(completionHandler: (String?, NSError?) -> ()) -> () { // If we already have an access key, call the completion handler with it immediately if let accessKey = self._accessKey { completionHandler(accessKey, nil) } else { // Otherwise request one Alamofire.request(.GET, MY_API_END_POINT).responseJSON { (request, response, JSON, error) in let info = JSON as? NSDictionary // info will be nil if it's not an NSDictionary let accessKey = info?["access_key"] as? String // accessKey will be nil if info is nil or the value for "access_key" is not a String self._accessKey = accessKey completionHandler(accessKey, error) } } } public func somethingNeedingAccessKey() { getAccessKey { (accessKey, error) in if accessKey != nil { // Use accessKey however you'd like here println(accessKey) } else { // Handle error / nil accessKey here } } }}
使用该设置,
somethingNeedingAccessKey()第一次调用将触发获取访问密钥的请求。之后的所有调用
somethingNeedingAccessKey()都将使用已存储在中的值
self._accessKey。如果您
somethingNeedingAccessKey在传递给的闭包内进行其余的工作
getAccessKey,则可以确保您的代码
accessKey始终有效。如果您需要另一个需要的功能
accessKey,只需以相同的方式
somethingNeedingAccessKey编写即可。
public func somethingElse() { getAccessKey { (accessKey, error) in if accessKey != nil { // Do something else with accessKey } else { // Handle nil accessKey / error here } }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)