swift3中带有objectmapper的alamofire包装类问题
Posted
技术标签:
【中文标题】swift3中带有objectmapper的alamofire包装类问题【英文标题】:Issue with the alamofire wrapper class with objectmapper in swift3 【发布时间】:2017-06-27 17:55:25 【问题描述】:我正在尝试为这样的 alamofire plus 对象映射器维护一个包装类
import UIKit
import Foundation
import AlamofireObjectMapper
import Alamofire
import ObjectMapper
class APIManager: NSObject
static let sharedInstance = APIManager()
public func performRequest<T: Mappable>(_requestURL: URL,method:HTTPMethod, headers: [String: String], parameter: [String: Any],success:@escaping (_ response: DataResponse<[T]>) -> Void, failure:@escaping (Error) -> Void)
Alamofire.request(_requestURL, method: method, parameters: parameter, encoding: JSONEncoding.default, headers:headers)
.responseObject (response: DataResponse<T>) in
print(response.result.value!)
switch(response.result)
case .success(_):
guard response.result.value != nil
else
print("Error")
return
DispatchQueue.main.async
if response.result.isSuccess
let responseValue = response.result.value
success(responseValue as! (DataResponse<[T]>)
)
break
case .failure(_):
if let error = response.result.error as? URLError
print("URLError occurred: \(error)")
failure(error)
else
print("Unknown error: \(String(describing: response.result.error))")
failure(response.result.error!)
break
我正在尝试从类中调用此包装器:
APIManager.sharedInstance.performRequest(_requestURL: loginAccessTokenURL!, method:.post, headers: Constants.Header, parameter:postParameters, success: DataResponse, failure: nil)
这是我从 viewdidload 调用的,但我收到以下错误: Please see the image for error
【问题讨论】:
【参考方案1】:Success 是一个回调,因此将其替换为以下内容:
APIManager.sharedInstance.performRequest(_requestURL: loginAccessTokenURL!,
method: .post,
headers: Constants.Header,
parameters: postParameters,
responseType: AnyObject
success: (response) in
//Call returned back success. Handle Response.
,
failure: nil)
编辑:
class BaseModel: Mappable
required init?(map: Map)
mapping(map: map)
func mapping(map: Map)
class APIManager: NSObject
static let sharedInstance = APIManager()
public func performRequest<T: Mappable>(_requestURL: URL,
method:HTTPMethod,
headers: [String: String],
parameter: [String: Any],
responseType: AnyObject,
success:@escaping (_ response: AnyObject) -> Void,
failure:@escaping (Error) -> Void)
Alamofire.request(_requestURL,
method: method,
parameters: parameter,
encoding: JSONEncoding.default,
headers:headers).responseJSON (response: DataResponse<T>) in
if response.result == .success
success((responseType as? BaseModel)?.mapping(map: Map.init(mappingType: .fromJSON, JSON: response.result.value)))
我想这就是你所说的。您所有的JSON
模型现在将是subClasses
的BaseModel
。您成功返回的对象将是初始化的responseType
对象。在您的情况下,responseType
将是 GetTravelShopsResponse
。
【讨论】:
有没有办法将“DataResponse”传递给网络包装类? 所以你想让 'APIManager' 来处理响应? 哦,你是想将一个完成块传递给从其他地方传入的成功吗? 是的,我也想将可映射的类名传递给包装器。 将其作为 func 的属性传入。我已经更新了我的答案以表明这一点。然后您可以使用它来相应地映射您的响应并在成功完成块中返回它。以上是关于swift3中带有objectmapper的alamofire包装类问题的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3 ObjectMapper - 将 URLSession 结果转换为 Map 对象失败
Swift 3 中带有异步调用的 CompletionHandler
Swift 3 的 ObjectMapper 和 Alamofire 问题 Alamofire 4 的 Alamofire 版本
Stack View 导致 Swift 3.0 中带有图像的按钮离开屏幕