تستخدم الوظيفة retryWhen
لإعادة المحاولة عندما يحدث خطأ معين، وفي هذه الحالة يتم إعادة المحاولة فقط عندما يكون الخطأ هو 401. لحل المشكلة التي تواجهها في تنفيذ ذلك، يمكنك تغيير الدالة retryWhen
لتقوم بإعادة المحاولة فقط عندما يكون الخطأ هو 401، وتمرير أي خطأ آخر كما هو.
قمت بتعديل الكود ليتم تنفيذ الدالة retryWhen
فقط عندما يكون الخطأ هو 401، وفي حالة حدوث أي خطأ آخر، يتم تمرير الخطأ كما هو دون إعادة المحاولة. هذا يعني أنه إذا تلقيت خطأ برمز الحالة 500، فلن تتم محاولة إعادة المحاولة، وسيتم تمرير الخطأ لمكان آخر للتعامل معه.
-
كيفية فك ضغط ونقل ملفات .gz في Hadoop28/01/2024
-
تحسين شيفرة لعبة الشنغمان بلغة Java02/02/2024
-
تبديل عرض كلمة المرور في أندرويد14/03/2024
-
توجيه الزوار بشكل ديناميكي في Angular 202/02/2024
swiftimport RxSwift
import KeychainAccess
import Moya
public extension ObservableType where E == Response {
/// Tries to refresh auth token on 401 errors and retry the request.
/// If the refresh fails, the signal errors.
public func retryWithAuthIfNeeded() -> Observable<E> {
return self.retryWhen { errors -> Observable<Void> in
errors.flatMap { error -> Observable<Void> in
guard let statusCode = (error as? MoyaError)?.response?.statusCode, statusCode == 401 else {
return Observable.error(error)
}
return AuthProvider.sharedInstance.request(
.LoginFacebookUser(
accessToken: AuthenticationManager.defaultInstance().getLoginTokenFromKeyChain(),
useFaceBookLogin: AuthenticationManager.defaultInstance().isFacebookLogin())
)
.filterSuccessfulStatusCodes()
.mapObject(Accesstoken.self)
.catchError { error in
log.debug("ReAuth error: \(error)")
if case Error.StatusCode(let response) = error, response.statusCode == 401 {
// Force logout after failed attempt
log.debug("401:, force user logout")
NSNotificationCenter.defaultCenter().postNotificationName(Constants.Notifications.userNotAuthenticated, object: nil, userInfo: nil)
}
return Observable.error(error)
}
.flatMapLatest { token -> Observable<Accesstoken> in
AuthenticationManager.defaultInstance().storeServiceTokenInKeychain(token)
return Observable.just(token)
}
.map { _ in }
}
}
}
}
يرجى ملاحظة أنني قمت بتغيير بعض أجزاء الكود لتكون متوافقة مع التغييرات التي قمت بها، ولكن يمكنك تعديلها وفقًا لاحتياجاتك ولبقية التطبيق.
المزيد من المعلومات
للحصول على معلومات إضافية حول كيفية استخدام retryWhen
لتحديث رموز المصادقة بناءً على رمز خطأ HTTP معين، يمكنك مراجعة الروابط التالية:
-
مقالة عن تحديث رموز المصادقة باستخدام Moya و RxSwift: توضح العملية بشكل عام وقد تكون مفيدة لفهم السياق العام للاستخدام.
-
مستندات Moya: تقدم معلومات حول كيفية استخدام
retryWhen
بشكل أكثر تفصيلًا، مع أمثلة توضيحية. -
مقالة عن RxSwift Retry Patterns: تشرح أنماط مختلفة لاستخدام
retryWhen
في RxSwift، وقد تكون مفيدة لاستكشاف خيارات أخرى للتعامل مع الأخطاء.
باستخدام هذه الموارد، يمكنك توسيع معرفتك بشكل أكبر حول كيفية استخدام retryWhen
وتخصيص سلوكه لتلبية احتياجات تطبيقك بشكل أفضل.