البرمجة

تحديث رموز المصادقة بـ Moya و RxSwift

تستخدم الوظيفة retryWhen لإعادة المحاولة عندما يحدث خطأ معين، وفي هذه الحالة يتم إعادة المحاولة فقط عندما يكون الخطأ هو 401. لحل المشكلة التي تواجهها في تنفيذ ذلك، يمكنك تغيير الدالة retryWhen لتقوم بإعادة المحاولة فقط عندما يكون الخطأ هو 401، وتمرير أي خطأ آخر كما هو.

قمت بتعديل الكود ليتم تنفيذ الدالة retryWhen فقط عندما يكون الخطأ هو 401، وفي حالة حدوث أي خطأ آخر، يتم تمرير الخطأ كما هو دون إعادة المحاولة. هذا يعني أنه إذا تلقيت خطأ برمز الحالة 500، فلن تتم محاولة إعادة المحاولة، وسيتم تمرير الخطأ لمكان آخر للتعامل معه.

swift
import 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 معين، يمكنك مراجعة الروابط التالية:

  1. مقالة عن تحديث رموز المصادقة باستخدام Moya و RxSwift: توضح العملية بشكل عام وقد تكون مفيدة لفهم السياق العام للاستخدام.

  2. مستندات Moya: تقدم معلومات حول كيفية استخدام retryWhen بشكل أكثر تفصيلًا، مع أمثلة توضيحية.

  3. مقالة عن RxSwift Retry Patterns: تشرح أنماط مختلفة لاستخدام retryWhen في RxSwift، وقد تكون مفيدة لاستكشاف خيارات أخرى للتعامل مع الأخطاء.

باستخدام هذه الموارد، يمكنك توسيع معرفتك بشكل أكبر حول كيفية استخدام retryWhen وتخصيص سلوكه لتلبية احتياجات تطبيقك بشكل أفضل.

مقالات ذات صلة

زر الذهاب إلى الأعلى

هذا المحتوى محمي من النسخ لمشاركته يرجى استعمال أزرار المشاركة السريعة أو تسخ الرابط !!