كيفية الاشتراك مباشرة في إشارة إشارة بدون flattenMap عند استخدام ReactiveCocoa؟

StackOverflow https://stackoverflow.com//questions/23015828

  •  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 الطريقة - وهي جيدة.يمكنك الحصول على التأثير الذي تريده من خلال تكوين البدائيات البسيطة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top