2015-04-15 8 views
6

कुछ घटना के बाद नया नाम कैसे प्राप्त करना बंद करें?ReactiveCocoa का उपयोग कर पर्यवेक्षक को कैसे हटाएं?

[RACObserve(self, username) subscribeNext:^(NSString *newName) { 
    if ([newName isEqualToString:@"SomeString"]) 
    { 
     //Do not observe any more 
    } 
}]; 

पीएस स्पष्ट प्रश्न के लिए खेद है, लेकिन मुझे जवाब नहीं मिल रहा है

उत्तर

9

प्रतिक्रियाशील कोको में चीजों के बारे में सोचना महत्वपूर्ण है: आप एक पर्यवेक्षक को "निकालना" नहीं चाहते हैं, आप एक संकेत बनाना चाहते हैं जो कुछ पूरा करता है हो जाता।

आप takeUntilBlock: का उपयोग एक संकेत है कि एक निश्चित समय के बाद मूल्यों भेजना बंद कर देगा प्राप्त करने के लिए कर सकते हैं:

[[RACObserve(self, username) takeUntilBlock:^(NSString *name) { 
    return [name isEqualToString:@"something"]; 
}] subscribeNext:^(NSString *name) { 
    NSLog(@"%@", name); 
}]; 

लेकिन उस स्ट्रिंग @"something", यह पहले ही नाम के लिए एक अगली नहीं भेज देंगे। अगर वह वांछित है, तो आप संलग्न कर सकते हैं:

NSString *sentinel = @"something"; 
[[[RACObserve(self, username) takeUntilBlock:^(NSString *name) { 
    return [name isEqualToString:sentinel]; 
}] concat:[RACSignal return:sentinel]] subscribeNext:^(NSString *name) { 
    NSLog(@"%@", name); 
}]; 

यह बहुत ही सुंदर नहीं है, लेकिन यदि आप एक takeUntilBlockInclusive सहायक है कि आप इस व्यवहार मिलेगा कर सकता है, और वहाँ में स्थूलता छिपाना।

+0

आपको बहुत बहुत धन्यवाद! – serj

8

आप RACDisposable ऑब्जेक्ट की विधि 'निपटान' का उपयोग कर सकते हैं जिसे 'subscribeNext' से वापस किया जा सकता है।

__block RACDisposable *handler = [RACObserve(self, username) subscribeNext:^(NSString *newName) { 
    if ([newName isEqualToString:@"SomeString"]) { 
     //Do not observe any more 
     [handler dispose] 
    } 
}]; 
+0

धन्यवाद! मैं यही देखना चाहता था। – serj

+0

यदि कोड की इस पंक्ति से पहले 'self.username'' SomeString 'के बराबर है, हैंडलर निपटान नहीं करेगा, क्या मैं सही हूँ? – KudoCC

संबंधित मुद्दे