كيفية الاشتراك مباشرة في إشارة إشارة بدون flattenMap عند استخدام ReactiveCocoa؟
-
21-12-2019 - |
سؤال
لدي طريقة تقوم بإرجاع إشارة الإشارة ويجب أن أستخدمها flattenMap
لاستخراج القيمة المغلفة في الإشارة.وبعد ذلك فقط يمكنني استخدام الاشتراك التالي:كامل:للحصول على القيمة.
يبدو الرمز كما يلي:
- (RACSignal *)publicSignal {
return [[self privateSignal] map:^id(NSString *code) {
return [self chainingSignalUsingCode:code];
}];
};
[[[obj publicSignal] flattenMap:^id(id value) {
return value;
}] subscribeNext:^(NSString *someValue) {
// extract the value;
} completed:^{
// something to do..
}];
هل هناك طريقة للقضاء على flattenMap
الكود حتى أتمكن من الاشتراك مباشرة في publicSignal
?
شكرا لك مقدما.
المحلول
حسنًا، يمكنك فقط القيام بذلك flattenMap
داخل publicSignal
...
- (RACSignal *)publicSignal {
return [[[self privateSignal] map:^id(NSString *code) {
return [self chainingSignalUsingCode:code];
}] flattenMap:^(id value) {
return value;
}];
}
[[obj publicSignal] subscribeNext:^(NSString *someValue) {
// extract the value;
} completed:^{
// something to do..
}];
ولكن بعد ذلك لماذا نحن map
بينغ ثم على الفور flattenMap
بينغ؟يمكننا فقط أن نقول:
- (RACSignal *)publicSignal {
return [[self privateSignal] flattenMap:^(NSString *code) {
return [self chainingSignalUsingCode:code];
}];
}
[[obj publicSignal] subscribeNext: ...
للحصول على نفس التأثير.
نضع في اعتبارنا أن flattenMap
ليس حقًا "استخراج القيمة في الإشارة." إنه استخراج الجميع القيم من الجميع الإشارات.متى privateSignal
يرسل إشارات جديدة، publicSignal
سوف يذهب إلى التالي ل كل قيمة ذلك كل يتم إرسال الإشارة - إنها في الأساس ستتذكر جميع الإشارات السابقة privateSignal
يرسل ويعيد توجيه كل ما يلي من خلال.إذا كان هذا هو ما تريده، فهذا رائع، إنه يعمل.ولكن إذا كنت تريد فقط "فك" الإشارة الأخيرة، فاستخدم switchToLatest
بدلاً من flattenMap
.
إذا كنت لا تريد التعديل publicSignal
, ، وتريد أن تكون إشارة من الإشارات، يمكنك استخدام الأبسط flatten
الطريقة والاشتراك في ذلك:
[[[obj publicSignal] flatten] subscribeNext: ...
منذ flattenMap
دون القيام بأي شيء يعادل flatten
(في الحقيقة flatten
يتم تنفيذه باعتباره flattenMap
التي ترجع قيمتها فقط).أو، إذا كنت تريد فقط الاشتراك في التالي من أحدث إشارة يتم إرسالها:
[[[obj publicSignal] switchToLatest] subscribeNext: ...
ولكن طالما أنها إشارة من الإشارات، فأنت بحاجة إلى القيام ببعض العمليات "لفكها".ليس هناك مساعد flattenAndThenSubscribe
الطريقة - وهي جيدة.يمكنك الحصول على التأثير الذي تريده من خلال تكوين البدائيات البسيطة.