Как установить предел времени ожидания запроса AWS Appsync || Клиент AWSAppSync не передает обратный вызов
Я использую AWS Appsync для текущего приложения, которое я разрабатываю и сталкиваюсь с серьезной проблемой: всякий раз, когда я запускаю запросы в клиенте Appsync, при медленном интернет-соединении запрос никогда не заканчивается обратным вызовом. Я проверил через Интернет, существует ограниченный источник информации по этой теме, а также нашел эту проблему, которая все еще остается открытой.
Это код, который я использовал, чтобы получить ответ
func getAllApi(completion:@escaping DataCallback){
guard isInternetAvailabele() else {
completion(nil)
return
}
// AppSyncManager.Client() is AWSAppSyncClient Object
AppSyncManager.Client().fetch(query: GetlAllPostQuery(input: allInputs), cachePolicy:.fetchIgnoringCacheData) {
(result, error) in
var haveError:Bool = error != nil
if let _ = result?.data?.getAllPostings?.responseCode {haveError = false} else {haveError = true}
if haveError {
print(error?.localizedDescription ?? "")
completion(nil)
return
}
if result != nil{
completion(result)
}else{
completion(nil)
}
}
}
Код прекрасно работает с подключением к интернету, и я уже проверил сверху, если нет интернета, но когда есть медленное подключение к интернету или Wi-Fi подключен к точке доступа, которую я создал на своем мобильном телефоне с отключенными данными Интернета, запрос не возвратите любой обратный вызов, он должен дать сбой предупреждение, как мы получаем в других API, когда время ожидания запроса истекло. Есть ли поддержка для запроса времени ожидания или я что-то пропустил?
Примечание: я получил эти журналы в Терминале
Task <06E9BBF4-5731-471B-9B7D-19E5E504E57F>.<45> HTTP load failed (error code: -1001 [1:60])
Task <D91CA952-DBB5-4DBD-9A90-98E2069DBE2D>.<46> HTTP load failed (error code: -1001 [1:60])
Task <06E9BBF4-5731-471B-9B7D-19E5E504E57F>.<45> finished with error - code: -1001
Task <D91CA952-DBB5-4DBD-9A90-98E2069DBE2D>.<46> finished with error - code: -1001
1 ответ
На самом деле может быть два возможных способа решения проблемы,
1) При настройке AWSAppSyncClientConfiguration
, предоставить обычай URLSessionConfiguration
и установить запрос timeout
для ваших нужд,
extension URLSessionConfiguration {
/// A `URLSessionConfiguration` to have a request timeout of 1 minutes.
static let customDelayed: URLSessionConfiguration = {
let secondsInOneMinute = 60
let numberOfMinutesForTimeout = 1
let timoutInterval = TimeInterval(numberOfMinutesForTimeout * secondsInOneMinute)
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = timoutInterval
configuration.timeoutIntervalForResource = timoutInterval
return configuration
}()
}
И передать эту конфигурацию сеанса, т.е. URLSessionConfiguration.customDelayed
при инициализации AWSAppSyncClientConfiguration
как он принимает URLSessionConfiguration
в приведенном ниже конструкторе,
public convenience init(url: URL,
serviceRegion: AWSRegionType,
credentialsProvider: AWSCredentialsProvider,
urlSessionConfiguration: URLSessionConfiguration = URLSessionConfiguration.default,
databaseURL: URL? = nil,
connectionStateChangeHandler: ConnectionStateChangeHandler? = nil,
s3ObjectManager: AWSS3ObjectManager? = nil,
presignedURLClient: AWSS3ObjectPresignedURLGenerator? = nil) throws {
2) Если первый не работает, то у вас есть другая возможность редактировать / разблокировать файлы pod напрямую. Есть класс AWSAppSyncRetryHandler
где вы можете изменить логику для повторного запроса. Если вам удастся решить проблему, вы можете разветвить исходное репо, клонировать репо, внести изменения в репо и в файл pods, указав этот модуль для использования своего репозитория. Это должно быть сделано, так как изменение файлов pod напрямую абсолютно неправильно, пока вы действительно не застряли и не хотите найти какое-то решение.
Обновление: эта проблема была исправлена с AppSync SDK 2.7.0