GraphQL Object mapping Apollo с различной схемой по цели - PullRequest
0 голосов
/ 28 августа 2018

У меня есть проект с несколькими целями.

Я реализовал Apollo для запроса базы данных с GraphQL. Цели имеют слегка одинаковую схему с некоторыми отличиями: +1 или 2 поля в зависимости от целей.

Я могу успешно собрать свое приложение, потому что я изменил свои фазы сборки, чтобы собрать только * common.graphql и * targetname.graphql

Таким образом, когда цель A имеет AnnuaireFragment, подобное:

fragment AnnuaireFragment on Directory {
    id
    test
}

и цель B имеет AnnuaireFragment так:

fragment AnnuaireFragment on Directory {
    id
}

Все можно построить, фрагменты разделены.

Мне бы хотелось, чтобы при использовании переводчика я тоже мог строить. Могу ли я использовать только один переводчик для двух целей?

static func translateFromAnnuaireNode(annuaireNode: GetAnnuaireFromSearchQuery.Data.Directory.Edge.Node) -> ContactModel {
            let contactModel = ContactModel()
            contactModel._id = annuaireNode.id
            // Here that doesn't build for target B because annuaireNode.test doesn't exist
            contactModel.test = annuaireNode.test

            return contactModel
}

Как мне успешно создать приложение для целей A и B?

1 Ответ

0 голосов
/ 28 августа 2018

При построении для цели B компилятор не знает о существовании другого определения класса GetAnnuaireFromSearchQuery.Data.Directory.Edge.Node, которое является специфическим для цели A. Это означает, что эта ошибка является ошибкой во время компиляции и единственным возможным способом решение - это решение во время компиляции.

Возможное решение, которое я могу придумать, - это использовать разные условия компиляции для разных целей.

Настройка следующая:

  1. В настройках сборки на одной из ваших целей расположите TARGET_A, а на другой - TARGET_B

enter image description here

  1. Используйте #if, чтобы различать цели во время компиляции

    static func translateFromAnnuaireNode(annuaireNode: GetAnnuaireFromSearchQuery.Data.Directory.Edge.Node) -> ContactModel {
        let contactModel = ContactModel()
        contactModel._id = annuaireNode.id
    
    
        #if TARGET_A
        //The code here will only be compiled when building target A
        contactModel.test = annuaireNode.test
        #endif
    
        return contactModel
    }
    
...