Как получить массив значений JSON, используя Graphql в Swift 4? - PullRequest
0 голосов
/ 15 сентября 2018

Я использую graphql для получения значений API, используя Apollo. Я успешно загрузил schema.json и получил значения от grpahql. но я не могу получить массив значений значений JSON.

Это мой пример ответа:

 {
  "data": {
  "team_Dashboard": {
  "activeMission": "Food Mission",
  "currentMissionChallenges": [
   {
    "id": "123",
    "title": "Challenge",
    "estTime": "5",
    "location": "Anywhere",
    "maxPts": "30",
    "status": "Not yet started"
   },
   {
    "id": "1234",
    "title": " II Challenge",
    "estTime": "5",
    "location": "Anywhere",
    "maxPts": "70",
    "status": "Not yet started"
    }
   ]
  }
 }
}

Запрос Graphql:

query teamDashboard($teamId: ID!) {
  team_Dashboard(teamId: $teamId) {
   activeMission
   currentMissionChallenges
 }
}

Ответ схемы Graphql:

missionDeadLine: String
currentMissionChallenges: [JSON]

Когда я добавляю currentMissionChallenges ([JSON]) в мой запрос Graphql, получаю ответ об ошибке с сервера. но когда я удаляю currentMissionChallenges из запроса Graphql, получаю ответ об успешном завершении и значения с сервера

Проблема в том, что currentMissionChallenges имеет формат [JSON]. Когда я изменяю свой запрос graphql Это ответ graphql

 query teamDashboard($teamId: ID!) {
  team_Dashboard(teamId: $teamId) {
   activeMission
   currentMissionChallenges {
        id
        title
        estTime
        location
        maxPts
        status
    }
  }
}

После отображения ошибки в dashBord.grpahql

Field "currentMissionChallenges" must not have a selection since type "[JSON]" has no subfields.

Как я могу получить значения массива json из graphql. В чем проблема получения значений Json? Пожалуйста, помогите мне!

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

The best thing about GraphQL is we can use the query as model

Поскольку ответ будет таким же, как и запрос, лучше назначить ответ переменной типа Query.

Позвольте мне объяснить на примере: -

Предположим, если мне нужно запросить данные моего профиля,

Profile.graphql

query MyProfile{
    player {
        me {
            id
            secret
            name
            email
            state
            country
            timezone
            picture
            pictureType
            audio
            rank
        }
    }
    countries{
        value
        viewValue
    }
}

Как только мы создадим приложение, оно создаст MyProfileQuery в API.swift. В viewController мы можем использовать ответ как показано ниже -

var myProfileData: MyProfileQuery.Data.Player.Me? // Declaring the valiable of player Type

ApolloClientManager.sharedInstance
                .fetchQuery(MyProfileQuery(), showLoader: true,
                            viewController: self) { (response) in // Fetching response using Apollo Client Manager
                if let allData = response {
                    if let profiledata = allData.player?.me {
                        self.myProfileData = profiledata // Assigning response into the variable declared
                        self.myEdittingProfileData = profiledata
                        self.updateUI()
                    }
                    if let countryData = allData.countries {
                        self.allCountrydata = countryData
                        self.getPickerDataForState(comppletion: {
                            self.openTimeZonePicker(completion: {
                                print("got timeZone Data")
                            })
                        })
                    }
                }

            }

Теперь у нас есть ответ в переменную myProfileData , которую мы можем использовать следующим образом -

Теперь мы можем получить доступ ко всем значениям, которые мы упомянули в нашем запросе, как показано ниже

print("player id is-          \(myProfileData?.id)")
print("player name is-        \(myProfileData?.name)")
print("player email is-       \(myProfileData?.email)")
print("player state is-       \(myProfileData?.state)")
print("player rank is-        \(myProfileData?.rank)")
print("player pictureType is- \(myProfileData?.pictureType)")

// player id is-          10
// player name is-        jordan
// player email is-       jordan@domain.com
// player state is-       Ohio
// player rank is-        101
// player pictureType is- custome
// 

Надеюсь, это поможет вам ???

0 голосов
/ 29 января 2019

Я предлагаю вам использовать пользовательский скаляр.

import Apollo
public typealias JSON = [String: Any]

extension Dictionary: JSONDecodable {
public init(jsonValue value: JSONValue) throws {

    if let array = value as? NSArray {
        self.init()
        if var dict = self as? [String: JSONDecodable & JSONEncodable] {
            dict["data"] = array as! [[String: Any]]
            self = dict as! Dictionary<Key, Value>
            return
        }
    }

    guard let dictionary = value as? Dictionary else {

        throw JSONDecodingError.couldNotConvert(value: value, to: Dictionary.self)
    }
    self = dictionary
}

}

var currentMissionChallanges = [JSON]()
func getTeamDashboard(id:String) {
     let query = TeamDashboardQuery(id:id)
     apollo.fetch(query:query) { [weak self] result, error in 
          if let dashboards = result.data?.team_dashboard {
             if let array = dashboards!["currentMissionChallanges"] as? 
[JSON] {
self?.currentMissionChallanges = array
}
          }
     }
}
...