在 AlamoFire 框架中访问映射对象返回 nil 值

Posted

技术标签:

【中文标题】在 AlamoFire 框架中访问映射对象返回 nil 值【英文标题】:Accessing mapped object in AlamoFire framework returns nil value 【发布时间】:2018-03-24 01:21:01 【问题描述】:

我正在使用基于 Alamofire 框架构建的 Swift Wrapper,通过它的 graphQL API 从 Yelp 返回业务数据。该调用返回一个 JSON 对象,然后将其映射到“CDYelpBusiness”类型的对象中,并且我可以访问它的所有属性(保存几个小时),其类型为 [CDYelpHour]?。它总是返回 nil,我确信这是由于我的误解,但我不确定是什么。这是我的电话:

    yelpAPIClient.cancelAllPendingAPIRequests()
    yelpAPIClient.searchBusinesses(byTerm: "Martinis",
                                 location: nil,
                                 latitude: MapCenter.shared.latitude,
                                longitude: MapCenter.shared.longitude,
                                   radius: 16000,
                               categories: nil,
                                   locale: nil,
                                    limit: 20,
                                   offset: 0,
                                   sortBy: nil,
                               priceTiers: nil,
                                  openNow: false,
                                   openAt: nil,
                               attributes: nil)  (response) in

                                performUIUpdatesOnMain 

                                    if let response = response,
                                        let businesses = response.businesses,
                                        businesses.count > 0 

                                        for business in businesses 
                                        Location.businesses.append(business)
                                            print(business.hours?[0].isOpenNow)

                                            let imageString = business.imageUrl?.absoluteString

                                            YelpClient.sharedInstance().loadImage(imageString, completionHandler:  (image) in
                                                Location.locationImages.append(image)
                                            )
                                        

                                    

这是响应映射到的 CDYelpBusiness 对象:

public class CDYelpBusiness: Mappable 

public var id: String?
public var name: String?
public var imageUrl: URL?
public var isClosed: Bool?
public var url: URL?
public var price: String?
public var phone: String?
public var displayPhone: String?
public var photos: [String]?
public var hours: [CDYelpHour]?
public var rating: Double?
public var reviewCount: Int?
public var categories: [CDYelpCategory]?
public var distance: Double?
public var coordinates: CDYelpCoordinates?
public var location: CDYelpLocation?
public var transactions: [String]?

public required init?(map: Map) 


public func mapping(map: Map) 
    id              <- map["id"]
    name            <- map["name"]
    imageUrl        <- (map["image_url"], URLTransform())
    isClosed        <- map["is_closed"]
    url             <- (map["url"], URLTransform())
    price           <- map["price"]
    phone           <- map["phone"]
    displayPhone    <- map["display_phone"]
    photos          <- map["photos"]
    hours           <- map["hours"]
    rating          <- map["rating"]
    reviewCount     <- map["review_count"]
    categories      <- map["categories"]
    distance        <- map["distance"]
    coordinates     <- map["coordinates"]
    location        <- map["location"]
    transactions    <- map["transactions"]


这是 CDYelpHour 对象:

public class CDYelpHour: Mappable 

public var hoursType: String?
public var open: [CDYelpOpen]?
public var isOpenNow: Bool?

public required init?(map: Map) 


public func mapping(map: Map) 
    hoursType   <- map["hours_type"]
    open        <- map["open"]
    isOpenNow   <- map["is_open_now"]


我可以更改我的 for 循环内的打印语句以提取其他属性,例如,使用 business.id 或 business.name,但尝试获取 hours 属性不起作用。

我正在尝试显示商家是否“现在营业”。虽然原始网络调用将此作为参数,但它仅用于过滤当前打开的业务的响应 - 当设置为 true 时。当设置为 false 时,作为默认值,它应该不返回对该参数的过滤器。虽然这似乎也不起作用。

这是框架:

https://github.com/chrisdhaan/CDYelpFusionKit

【问题讨论】:

【参考方案1】:

好吧,让这成为我自己更彻底阅读文档的一个教训。

CDYelpFusionKit 框架旨在与 Yelp 的 RESTful API 一起使用,而不是与 graphQL API 一起使用,因为它可以在原始的单一网络调用中获取企业的营业时间。

虽然 CDYelpBusiness 类确实包含小时变量,但必须在单独的网络调用中检索这些变量。

美好时光。

【讨论】:

以上是关于在 AlamoFire 框架中访问映射对象返回 nil 值的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 响应对象映射

Mybatis学习——初始MyBatis

无法在实体框架中映射 SYS_REFCURSOR

在紧凑框架上映射对象

使用 Alamofire 和不记名令牌序列化对象

具有核心数据的 Alamofire 对象映射器