我通过使用swift创建的API进行url调用,如下所示:

class API {

  let apiEndPoint = "endpoint"
  let apiUrl:String!
  let consumerKey:String!
  let consumerSecret:String!

  var returnData = [:]

  init(){
    self.apiUrl = "https://myurl.com/"
    self.consumerKey = "my consumer key"
    self.consumerSecret = "my consumer secret"
  }

  func getOrders() -> NSDictionary{
    return makeCall("orders")
  }

  func makeCall(section:String) -> NSDictionary{

    let params = ["consumer_key":"key", "consumer_secret":"secret"]

    Alamofire.request(.GET, "\(self.apiUrl)/\(self.apiEndPoint + section)", parameters: params)
        .authenticate(user: self.consumerKey, password: self.consumerSecret)
        .responseJSON { (request, response, data, error) -> Void in
            println("error \(request)")
            self.returnData = data! as NSDictionary
    }
    return self.returnData
  }

}

我在我的UITableViewController中调用这个API,用SwiftyJSON库填充表.然而,API中的returnData总是空的.AlomFire调用没有问题,因为我可以成功地检索值.我的问题是,我应该如何将这个data带到我的表视图控制器?

var api = API()
api.getOrders()
println(api.returnData) // returnData is empty

推荐答案

正如马特所指出的,Alamofire通过"完成处理程序"模式异步返回数据,因此您必须执行同样的操作.您不能立即将该值设置为return,而是希望将方法更改为不返回任何内容,而是使用完成处理程序闭包模式.

如今,这可能看起来像:

func getOrders(completionHandler: @escaping (Result<[String: Any]>) -> Void) {
    performRequest("orders", completion: completionHandler)
}

func performRequest(_ section: String, completion: @escaping (Result<[String: Any]>) -> Void) {
    let url = baseURL.appendingPathComponent(section)
    let params = ["consumer_key": "key", "consumer_secret": "secret"]

    Alamofire.request(url, parameters: params)
        .authenticate(user: consumerKey, password: consumerSecret)
        .responseJSON { response in
            switch response.result {
            case .success(let value as [String: Any]):
                completion(.success(value))

            case .failure(let error):
                completion(.failure(error))

            default:
                fatalError("received non-dictionary JSON response")
            }
    }
}

然后,当你想调用它时,你可以使用这个completion闭包参数(如果你想的话,在尾随闭包中):

api.getOrders { result in
    switch result {
    case .failure(let error):
        print(error)

    case .success(let value):
        // use `value` here
    }
}

// but don't try to use the `error` or `value`, as the above closure
// has not yet been called
//

Swift相关问答推荐

为什么不能使用actor作为AsyncSequence中的状态机类型?

Swift 5.10:无法从非隔离的deinit访问属性*,这是Swift 6中的错误''''

MyApp类型不符合协议App''''

在解码字符串时需要帮助.

如何使用变量 Select 哪个向量(?)在我的 struct 中密谋吗?

从SwiftUI使用UIPageView时,同一页面连续显示两次的问题

如何在SWIFT Memory中处理对VAR数组的更新(对COW感到困惑)

当模式以编程方式关闭时在父视图控制器中触发操作

在SwiftUI中如何预览嵌套的ScrollView,以避免触发可刷新修饰符

Swift 数组拆分成重叠的块

如何让默认函数参数引用另一个函数参数?

使第二个视图变灰 SwiftUI

SwiftUI View Builder 参数无法更改状态

Alamofire 会自动存储 cookie 吗?

swift中的SequenceType和CollectionType有什么区别?

FirebaseStorage:如何删除目录

使用 DispatchTime.now() + float 延迟?

Alamofire:如何全局处理错误

如何在 Swift 中使用 Crashlytics 登录?

swift - 我可以从我的自定义初始化方法中调用 struct 默认成员初始化吗?