Правильный рабочий процесс при редактировании класса в GraphQL - PullRequest
2 голосов
/ 18 апреля 2020

Я нахожусь на xcode 11.4 и swift4, и в настоящее время я работаю с AWS GraphQL и изучаю правильный рабочий процесс. Мой amplify.xyz конфиг установлен как

push=true
modelgen=true
profile=default
envName=amplify

, чтобы модели генерировались по мере их создания / редактирования. В schema.graphql я определяю пользователя:

type User @model {
    id: ID!
    firstName  : String!
    lastName   : String!
    handle     : String!
    email      : String!
}

И создаю / запускаю приложение, и могу создать / прочитать экземпляр user, как и ожидалось. Затем предположим, что я добавляю простое новое поле User @model, чтобы у меня было:

type User @model {
    id: ID!
    firstName  : String!
    lastName   : String!
    handle     : String!
    email      : String!
    blank      : String!
}

А затем очистите папку сборки и пересоберите приложение. Затем я получаю необъяснимую ошибку

No such module 'Amplify' HomeController.swift

Даже если изменение класса Model и Amplify не связано. Если я удаляю blank, очищаю и перестраиваю, все снова нормально. В чем причина такого поведения?

Для справки, вот мой подфайл:

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'alpha' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for alpha
    pod 'amplify-tools'

    pod 'Amplify'
    pod 'AWSPluginsCore'
    pod 'AmplifyPlugins/AWSAPIPlugin'

    pod 'AWSMobileClient', '~> 2.13.0'      # Required dependency
    pod 'AWSUserPoolsSignIn', '~> 2.13.0'

    pod 'AWSAppSync', '~> 3.1.0'
    pod 'AWSMobileClient', '~> 2.13.0'
    pod 'AWSAuthUI', '~> 2.13.0'
    pod 'AWSUserPoolsSignIn', '~> 2.13.0'

end

______________________ ОБНОВЛЕНИЕ ___________________

Я и amplify push, как предложил Жюльен С., и убедитесь, что все файлы в amplify/generated/models перемещены в каталог верхнего уровня согласно (https://aws-amplify.github.io/docs/ios/start?ref=amplify-iOS-btn). Теперь эта проблема No such module 'Amplify' HomeController.swift решена. Однако я больше не могу найти данные, которые были сохранены до обновления модели. Для справки: когда пользователь создает учетную запись, я получаю доступ к токену пользователя и сохраняю его вместе с электронной почтой пользователя. Затем в следующий раз, когда пользователь открывает приложение, я снова получаю токен и запрашиваю у пользователя db по токену. Соответствующий код:

class CognitoPoolProvider : AWSCognitoUserPoolsAuthProviderAsync {

    func getLatestAuthToken(_ callback: @escaping (String?, Error?) -> Void) {

        AWSMobileClient.default().getTokens { (token, error) in
            if let error = error {
                callback(nil,error)
            }
            callback(token?.accessToken?.tokenString, error)
        }
    }
}

В MainController.swift:

override func viewDidLoad() {
    super.viewDidLoad()

    // get user token
    let pool = CognitoPoolProvider();

    pool.getLatestAuthToken { (token, error) in

        if let error = error {

            print("error: \(error)")

        } else {
            self.getUserData(token: token!)
        }
    }
}

func getUserData(token:String){

    print("token >>>> \(token)")

   // this is successful. you got all the user stuff
   // when you change the user model, you can no longer query the user
   let _ = Amplify.API.query(from: User.self, byId: token) { (event) in
        switch event {
            case .completed(let result):
                switch result {
                    case .success(let note):
                        guard let note = note else {
                            print("API Query completed but missing user")
                            return
                        }
                        print("API Query successful, got user: \(note)")
                case .failure(let error):
                    print("Completed with error: \(error.errorDescription)")
                    }
            case .failed(let error):
                print("Failed with error \(error.errorDescription)")
            default:
                print("Unexpected event")
        }
    }

}

1 Ответ

0 голосов
/ 18 апреля 2020

Я предполагаю, что вы все настраиваете через Amplify CLI? Используете ли вы новый или старый iOS SDK для Amazon? Мой рабочий процесс обычно был при настройке моего файла schema.graphql для запуска команды ampify pu sh, чтобы фактически распространить эти изменения на серверную часть и убедиться, что он генерирует файл API.swift. Ваши графические операции выполняются через автоматически сгенерированный файл api.swift? Вы также можете запустить Ampify Codegen для воссоздания файла api.swift.

...