【问题标题】:CompletionHandler for AlamofireAlamofire 的 CompletionHandler
【发布时间】:2017-08-04 11:54:00
【问题描述】:

我正在尝试返回 responseJSON

static func getAllPersons(completionhandler:@escaping (Any) -> ()){
    let URL = baseURL + "api/person"
    Alamofire.request(URL).responseJSON {
        response in
        completionhandler(response.result.value as Any)
    }
}

但如果我尝试将 responseJSON 存储在“res”中,它将不起作用:

var res: Any = ""
PersonResource.getAllPersons{ (result) in
    res = result
}
print(res)

最好的问候

【问题讨论】:

    标签: ios swift alamofire completionhandler


    【解决方案1】:

    response.result.value 是可选的,所以尝试返回 Any?。但这是更好的方法:

    static func getAllPersons(completionhandler:@escaping ([String: Any]?, Error?) -> ()){
        let URL = baseURL + "api/person"
        Alamofire.request(URL).responseJSON {
            response in
            if let json = response.result.value as? [String: Any] {
                    completionhandler(json, nil)
            }
            else if let error = response.result.error as Error? {
                    completionHandler(nil, error)
            }
        }
    }
    

    【讨论】:

      【解决方案2】:
      var res: Any = ""
      PersonResource.getAllPersons{ (result) in
          res = result
          print(res)
      }
      

      把打印语句放在里面会打印结果

      为什么?

      PersonResource.getAllPersons 是一个异步调用,因此 print(res) 甚至在 PersonResource.getAllPersons 的完成块执行并设置 res 之前就被执行

      【讨论】:

      • 感谢您的回答我明白,但我需要将其解析为人员列表并在多个视图中使用它,所以我想存储它。有没有办法做到这一点?
      • @adrian-i :在 getAllPersons{ 完成块中编写您的解析代码。如果您希望数据在多个视图之间共享,请创建一个单例数据源对象(如应用程序委托中的数组)并在此处填充它。以多种方式填充数组后,您可以重新加载视图以显示数据更改。您可以为数据源编写getter并触发通知,指示数据源对其他视图的修改和视图可以重新加载自己:)
      • 你的意思是有点像本地存储库?
      • @adrian-i : 我不太确定你对本地 repo 的想法是什么 :) 但是如果你想让数据持久化,你可以在这种情况下使用核心数据 NSFetchedResultsController 会让你知道什么时候数据更改,如果您不希望数据持久存在,您可以在单例类中使用数组(例如应用程序委托或创建您自己的单例类,例如 AdrianDataSource 并在其中有一个数组作为属性并跨多个 VC 访问它:)
      猜你喜欢
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      相关资源
      最近更新 更多