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 模型现在将是subClassesBaseModel。您成功返回的对象将是初始化的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 中带有图像的按钮离开屏幕

django.db.migrations 是不是有“更新迁移”(ala South)选项?

是否有用于在 Django 中实现视图模型装饰器 ala Draper 的库?