【问题标题】:Alamofire Web service manager returns nil in viewControllerAlamofire Web 服务管理器在 viewController 中返回 nil
【发布时间】:2017-12-16 15:39:53
【问题描述】:

我想创建包含我所有请求的AlamofireWebService 管理器,我只在viewControllers 中使用此类的类函数,并在viewController 中使用响应。
例如viewController 中的类似内容:

 let cardResponse : String?
 cardResponse = WebServiceManager.shared.getCardTitle()

我搜索并发现我应该在我的函数中使用转义completionHandler,我写了这个:

import Foundation
import Alamofire
import SwiftyJSON

class WebServiceManager {

    static let shared : WebServiceManager = WebServiceManager()

    let apiEndPoint = "My URL"

    func getCardTitle(completionHandler: @escaping (NSDictionary?, Error?) -> ()) {
        Alamofire.request("\(apiEndPoint)")
            .responseJSON { response in
                switch response.result {
                case .success(let value):
                      print("from .success \(value)")
                      completionHandler(value as? NSDictionary, nil)
                case .failure(let error):
                      completionHandler(nil, error)
                }
        }

    }
}

在成功的情况下,打印工作正常,但在 viewController 中,它只打印 nil。

我的viewController:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    WebServiceManager.shared.getCardTitle() { responseObject, error in
        // use responseObject and error here

        print("responseObject = \(responseObject); error = \(error)")
        return
    }

}

我应该怎么做才能在viewController打印我的回复?

【问题讨论】:

    标签: ios swift3 uiviewcontroller alamofire


    【解决方案1】:

    这意味着您的值不能转换为 NSDictionary 它有另一种类型。

    completionHandler(value as? NSDictionary, nil)
    

    请在管理器中尝试“伪代码”

    if let dic = value as? [String: Any] {
       debugPrint("Dic \(dic)")
    } else  if let str = value as? String {
       debugPrint("String \(str)")
    } else if let data = value as? Data, let str = String(data: data, encoding: .utf8) {
       debugPrint("UTF8 String \(str)")
    } 
    

    【讨论】:

      【解决方案2】:

      只检查响应为零

           Alamofire.request("URL", method: .post).responseJSON{(responseData) -> Void in
              if((responseData.result.value != nil)){
                  let jsonData = JSON(responseData.result.value)
      
                  if let arrJSON = jsonData["keyNodes"].arrayObject {
      
                      for index in 0...arrJSON.count-1 {
                          let aObject = arrJSON[index] as! [String : AnyObject]
                          var sl:String;
                          if let sl1 = aObject["sl"] as? String {
                              sl = sl1;
                          }
                      }
                  }
      
              }
          }
      

      【讨论】:

      • 我检查了,正如我所说的成功案例中的响应打印
      • 我认为您在谈论您已经发现来自服务器的响应 & json 响应键为零。对
      猜你喜欢
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      相关资源
      最近更新 更多