دمج البيانات الموجهة
تم إعداد ترجمة المقال خصيصًا لطلاب الدورة المتقدمة "iOS Developer" .
في الحلقة السابقة ، نجحنا في تصميم نموذج دفق من القيم ، حيث تم إرفاق عامل واحد بسيط ( delay
) بكل قيمة .في هذا الجزء ، سنلقي نظرة على عدد قليل من عوامل التشغيل ، ونصنعها ، Codeable
ونحولها أخيرًا إلى دمج الناشر في وقت التشغيل.
أنواع عامل التشغيل
قبل أن نبدأ في تصميمها ، نحتاج إلى فهم أنواع العوامل الموجودة.يقوم موقع ReactiveX بتقسيمها إلى حوالي 10 فئات: إنشاء ، تحويل ، تصفية ، دمج ، معالجة الأخطاء ، مساعدة ، مشروطة ، رياضية / مجمعة ، ضغط خلفي ، يمكن الاتصال به ويمكن ملاحظته (To). إذا كنت مهتمًا ، فإن ReactiveX لديه تفسير جيد لكل نوع وعامل.ملاحظة: إذا كنت لم تكن مألوفة مع RxSwift، يمكن ملاحظتها في RxSwift ما يعادل الناشر في الجمع بين.
في الجزء السابق ، ذكرنا عامل التشغيل delay
، الذي يشير إلى utility
النوع المساعد ( ). سنركز اليوم على الحفاظ على عاملي تصفية ( filtering
).
عوامل التصفية
يمنع هذا النوع من المشغلات كل أو بعض (أو لا شيء) عناصر التدفق من التحرك إلى أعلى إلى أعلى استنادًا إلى هذا الشرط.إسقاط أولا
dropFirst
توقف انتقال n
العناصر الأولى . يمكننا ببساطة إضافته إلى تعدادنا Operator
، نظرًا لبساطته.enum Operator {
case delay(seconds: Double)
case dropFirst(count: Int)
}
يمكننا أيضًا بسهولة تحويل حالة القائمة هذه إلى Publisher.extension Operator {func applyPublisher<T>(_ publisher: AnyPublisher<T, Never>) -> AnyPublisher<T, Never> {
switch self {
case .dropFirst(let count):
return publisher.dropFirst(count).eraseToAnyPublisher()
}}}
الآن dropFirst
يمكن حفظ عامل التشغيل وعرضه في قائمة عوامل التشغيل.
التوفير dropFirst
يشبه عامل التشغيل delay
. ربما لا تختلف الترشيح عن عوامل التشغيل المساعدة. حسنًا ، لنجرب بيانًا آخر قبل أن نخرج بهذا الاستنتاج.منقي
في المقابل dropFirst
، الذي يحتوي على معايير تصفية بسيطة للغاية ، filter
يستخدم عامل التشغيل الإغلاق بدلاً من النوع البدائي. هذه حالة أكثر تعقيدًا. كيف نحفظ وننشر الإغلاق؟filter(_:)
إعادة نشر جميع العناصر التي تتطابق مع الإغلاق المحدد.
developer.apple.com
دعونا نلقي نظرة فاحصة على الطريقة filter
.func filter(_ isIncluded: @escaping (Self.Output) -> Bool) -> Publishers.Filter<Self>
isIncluded
يأخذ إغلاقها نوعًا عالميًا ويعيد قيمة منطقية.هل يوجد أي شيء في الأساس يمثل الشروط المنطقية ويعيد القيمة المنطقية؟ يذكرني بشيء؟التصفية باستخدام NSPredicate
الجواب NSPredicate
. إذا تمكنا من حفظ شروط التصفية كتعبيرات بتنسيق سلسلة ، فيمكننا ببساطة تمرير قيمة الدفق واستخدامها NSPredicate
لتقييم النتائج.دعنا نكمل ونضيف filter
إلى القائمة.enum Operator {
case delay(seconds: Double)
case dropFirst(count: Int)
case filter(expression: String)
}
كل ما علينا فعله هو تصفية عبارات مثل %d !=3
أو %@ != “D”
؛ لذلك ، التعبير نوع مناسب. وبالمثل ، يجب أن نتمكن من نقل القائمة filter
إلى الناشر.extension Operator {
func applyPublisher<T>(_ publisher: AnyPublisher<T, Never>) -> AnyPublisher<T, Never> {
switch self {
case .filter(let expression):
return publisher.filter { value in
NSPredicate(format: expression,
argumentArray: [value])
.evaluate(with: nil) }.eraseToAnyPublisher()
}}}
كما هو مخطط ، نرسل التعبير إلى NSPredicate
جانب القيمة المرسلة من Publisher.لاحظ أن NSPredicate
يقبل مجموعة من الحجج. لذلك ، يجب أن تعمل مع بعض التعديلات ، حتى عندما تفترض القيم تنسيق الصفوف ، وهو أمر شائع جدًا في السيناريوهات التفاعلية. سنعود إلى ذلك في المستقبل عندما نتحدث عن مشغلي الجمع.
كما ترى ، تمت إضافة فلتر التصفية إلى هذه المجموعة المحفوظة من العبارات وتحويلها إلى Publisher لتصفية الرقم 3 من القيم الأعلى.
في الحلقة القادمة: إنقاذ مشغلي التحويل ، الخريطة والمسح الضوئي
في عرض GIF ، قد تجد أن قائمة عوامل التشغيل فارغة جدًا. في الأسابيع القليلة المقبلة ، سنقوم بملئه بأنواع مختلفة من عوامل التشغيل: عوامل التحويل ، map
و scan
.يمكنك العثور على شفرة المصدر في مستودع الجمع بين السحر والسويفي في مجلد ساحة اللعب.نحن نتطلع إلى تعليقاتك وندعوك لفتح يوم في الدورة .