Swift 阿拉莫菲尔快速关闭
我正在对服务器进行API调用。我正在利用阿拉莫菲尔来处理这件事。我试图创建一个函数,该函数使用Alamofire的GET函数返回一个基于自定义类的对象,该自定义类保存该GET函数提供的各种输出 我不清楚该怎么做 下面是我的自定义类,它将保存有关响应的详细信息:Swift 阿拉莫菲尔快速关闭,swift,alamofire,Swift,Alamofire,我正在对服务器进行API调用。我正在利用阿拉莫菲尔来处理这件事。我试图创建一个函数,该函数使用Alamofire的GET函数返回一个基于自定义类的对象,该自定义类保存该GET函数提供的各种输出 我不清楚该怎么做 下面是我的自定义类,它将保存有关响应的详细信息: import Foundation class ResponsePackage { var success = false var response: AnyObject? = nil var error: N
import Foundation
class ResponsePackage {
var success = false
var response: AnyObject? = nil
var error: NSError? = nil
}
在另一个类中,我具有以下功能:
func get(apiEndPoint: NSString) -> ResponsePackage {
let responsePackage = ResponsePackage()
Alamofire
.request(.GET, apiEndPoint)
.responseJSON {(request, response, JSON, error) in
responsePackage.response = JSON
responsePackage.success = true
responsePackage.error = error
}
return responsePackage
}
这将返回
nil
,因为在执行return
之前对服务器的调用尚未完成。我知道我应该能够用闭包实现这一点,但我不确定如何构造它。在{}
之间的代码相当于objective-C中的块:这是异步执行的代码块
您所犯的错误是您放置return语句的地方:当您启动请求时,{}
中的代码在框架收到响应之前不会执行,因此当到达return
语句时,很可能仍然没有响应。您可以简单地移动该行:
return responsePackage
在闭包内部,因此func
仅在收到响应时返回。这是一种简单的方法,但并不是真正的最优方法:您的代码将在等待答案时陷入困境。最好的方法就是使用闭包。这看起来像:
func get(apiEndPoint: NSString, completion: (response: ResponsePackage) -> ()) -> Bool {
let responsePackage = ResponsePackage()
Alamofire
.request(.GET, apiEndPoint)
.responseJSON {(request, response, JSON, error) in
responsePackage.response = JSON
responsePackage.success = true
responsePackage.error = error
completion(response: responsePackage)
}
}
我举一个例子来回答你关于responseJSON和闭包的问题: 按照以下步骤操作: 首先,您可以在常规类(例如Constants.swift类)中创建自定义类型: 然后在你们班上:
// Normal http request with JSON response..
func callJSONrequest(url:String, params:[String: AnyObject]?, success successBlock :apiSuccess,
failure failureBlock :apiFailure) {
Alamofire.request(.GET, url, parameters: params, encoding: ParameterEncoding.URL)
.responseJSON { response in
print("\(response.request?.URL)") // original URL request
//print(response.response) // URL response
//print(response.data) // server data
//print(response.result) // result of response serialization
if response.result.isSuccess {
let jsonDic = response.result.value as! NSDictionary
successBlock(result: jsonDic)
} else {
let httpError: NSError = response.result.error!
let statusCode = httpError.code
let error:NSDictionary = ["error" : httpError,"statusCode" : statusCode]
failureBlock(error: error)
}
}
}
}
func myCommonFunction() {
let myApiSuccess: apiSuccess = {(result: NSDictionary?) -> Void in
print ("Api Success : result is:\n \(result)")
// Here you can make whatever you want with result dictionary
}
let myApiFailure: apiFailure = {(error: NSDictionary?) -> Void in
print ("Api Failure : error is:\n \(error)")
// Here you can check the errors with error dictionary looking for http error type or http status code
}
var params :[String: AnyObject]?
let name : String! = "this is my name"
let id : String! = "000a"
params = ["name" : name, "id" : id]
let url : String! = "https://etc..."
callJSONrequest(url, params:params, success: myApiSuccess, failure: myApiFailure)
}
谢谢@Emilie。我怎么称呼这个函数?@shawnzizzo我也有类似的问题。。。你能弄明白吗?如果是这样的话,你是如何调用这个函数来返回你的包的呢?client.get(apident:NSString){(responsePackage)->Void in println(responsePackage)}我还知道如何调用上面这个例子中的completionhandler..你不能再为闭包指定类型别名了。例如,改用:
typealias apisccess=(字典?->Void
// Normal http request with JSON response..
func callJSONrequest(url:String, params:[String: AnyObject]?, success successBlock :apiSuccess,
failure failureBlock :apiFailure) {
Alamofire.request(.GET, url, parameters: params, encoding: ParameterEncoding.URL)
.responseJSON { response in
print("\(response.request?.URL)") // original URL request
//print(response.response) // URL response
//print(response.data) // server data
//print(response.result) // result of response serialization
if response.result.isSuccess {
let jsonDic = response.result.value as! NSDictionary
successBlock(result: jsonDic)
} else {
let httpError: NSError = response.result.error!
let statusCode = httpError.code
let error:NSDictionary = ["error" : httpError,"statusCode" : statusCode]
failureBlock(error: error)
}
}
}
}
func myCommonFunction() {
let myApiSuccess: apiSuccess = {(result: NSDictionary?) -> Void in
print ("Api Success : result is:\n \(result)")
// Here you can make whatever you want with result dictionary
}
let myApiFailure: apiFailure = {(error: NSDictionary?) -> Void in
print ("Api Failure : error is:\n \(error)")
// Here you can check the errors with error dictionary looking for http error type or http status code
}
var params :[String: AnyObject]?
let name : String! = "this is my name"
let id : String! = "000a"
params = ["name" : name, "id" : id]
let url : String! = "https://etc..."
callJSONrequest(url, params:params, success: myApiSuccess, failure: myApiFailure)
}