Включение кеша для клиента AWS AppSync iOS Swift - PullRequest
0 голосов
/ 17 сентября 2018

Я использую AWS AppSync для создания своего iOS-приложения. Я хочу использовать автономную мутацию, а также кэширование запросов, предоставляемое AppSync. Но когда я отключаю свой интернет, я не получаю никакого ответа. Скорее он показывает ошибку как «Интернет-соединение, кажется, в автономном режиме.». Похоже, это скорее исключение Alamofire, чем исключение AppSync. Это потому, что запрос не кэшируется внутри моего устройства. Ниже приведен фрагмент кода для инициализации клиента.

do {
    let appSyncClientConfig = try AWSAppSyncClientConfiguration.init(url: AWSConstants.APP_SYNC_ENDPOINT, serviceRegion: AWSConstants.AWS_REGION, userPoolsAuthProvider: MyCognitoUserPoolsAuthProvider())
    AppSyncHelper.shared.appSyncClient = try AWSAppSyncClient(appSyncConfig: appSyncClientConfig)
    AppSyncHelper.shared.appSyncClient?.apolloClient?.cacheKeyForObject = { $0["id"] }
} catch {
    print("Error in initializing the AppSync Client")
    print("Error: \(error)")
    UserDefaults.standard.set(nil, forKey: DeviceConstants.ID_TOKEN)
}

Я кэширую токен в UserDefaults во время извлечения сеанса, а затем всякий раз, когда вызывается AppSyncClient, он выбирает последний токен, вызывая метод getLatestAuthToken() моего MyCognitoUserPoolsAuthProvider: AWSCognitoUserPoolsAuthProvider. Это возвращает токен, хранящийся в UserDefaults -

// background thread - asynchronous
func getLatestAuthToken() -> String {
    print("Inside getLatestAuthToken")
    var token: String? = nil
    if let tokenString = UserDefaults.standard.string(forKey: DeviceConstants.ID_TOKEN) {
        token = tokenString
        return token!
    }
    return token!
}

Мой шаблон запроса следующий

public func getUserProfile(userId: String, success: @escaping (ProfileModel) -> Void, failure: @escaping (NSError) -> Void) {
    let getQuery = GetUserProfileQuery(id: userId)
    print("getQuery.id: \(getQuery.id)")
    if appSyncClient != nil {
        print("AppSyncClient is not nil")
        appSyncClient?.fetch(query: getQuery, cachePolicy: CachePolicy.returnCacheDataElseFetch, queue: DispatchQueue.global(qos: .background), resultHandler: { (result, error) in
            if error != nil {
                failure(error! as NSError)
            } else {
                var profileModel = ProfileModel()
                print("result: \(result)")
                if let data = result?.data {
                    print("data: \(data)")
                    if let userProfile = data.snapshot["getUserProfile"] as? [String: Any?] {
                        profileModel = ProfileModel(id: UserDefaults.standard.string(forKey: DeviceConstants.USER_ID), username: userProfile["username"] as? String, mobileNumber: userProfile["mobileNumber"] as? String, name: userProfile["name"] as? String, gender: (userProfile["gender"] as? Gender).map { $0.rawValue }, dob: userProfile["dob"] as? String, profilePicUrl: userProfile["profilePicUrl"] as? String)
                    } else {
                        print("data snapshot is nil")
                    }
                }
                success(profileModel)
            }
        })
    } else {
        APPUtilites.displayErrorSnackbar(message: "Error in the user session. Please login again")
    }
}

Я использовал все 4 объекта CachePolicy, предоставленных AppSync, т.е.

CachePolicy.returnCacheDataElseFetch
CachePolicy.fetchIgnoringCacheData
CachePolicy.returnCacheDataDontFetch
CachePolicy.returnCacheDataAndFetch.

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

1 Ответ

0 голосов
/ 19 сентября 2018

Хорошо, так что я нашел ответ сам. DatabaseUrl является необязательным аргументом. Это не входит в предложения, когда мы инициализируем объект AWSAppSyncClientConfiguration.

Итак, новый способ, которым я инициализировал клиента, следующий:

let databaseURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(AWSConstants.DATABASE_NAME, isDirectory: false)
    do {
        let appSyncClientConfig = try AWSAppSyncClientConfiguration.init(url: AWSConstants.APP_SYNC_ENDPOINT,
                           serviceRegion: AWSConstants.AWS_REGION,
                           userPoolsAuthProvider: MyCognitoUserPoolsAuthProvider(),
                           urlSessionConfiguration: URLSessionConfiguration.default,
                           databaseURL: databaseURL)
        AppSyncHelper.shared.appSyncClient = try AWSAppSyncClient(appSyncConfig: appSyncClientConfig)

        AppSyncHelper.shared.appSyncClient?.apolloClient?.cacheKeyForObject = { $0["id"] }
    } catch {
        print("Error in initializing the AppSync Client")
        print("Error: \(error)")
    }

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

...