AlamoFire GET API请求无法按预期工作

AlamoFire GET API请求无法按预期工作,第1张

AlamoFire GET API请求无法按预期工作

解决此问题的一种方法是将闭包(通常称为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        }    }}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5010310.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存