ReactiveCocoa बनाम RxSwift - पेशेवरों और विपक्ष?


256

इसलिए अब तेजी के साथ, ReactiveCocoa के लोगों ने स्विफ्ट के लिए संस्करण 3.0 में इसे फिर से लिखा है

इसके अलावा, RxSwift नाम का एक और प्रोजेक्ट आया है

मुझे आश्चर्य है कि अगर लोग दो फ्रेमवर्क के डिज़ाइन / एपीआई / दर्शन में अंतर के बारे में जानकारी जोड़ सकते हैं (कृपया, एसओ की भावना में, उन चीजों से चिपके रहें जो सत्य हैं, जिनके बारे में राय "सर्वश्रेष्ठ" है)

[StackOverflow mods के लिए ध्यान दें: इस सवाल का निश्चित उत्तर है, उत्तर दो फ्रेमवर्क के बीच अंतर है। मुझे लगता है कि यह SO के लिए विषय पर भी अत्यधिक है]

आरंभ करने के लिए, उनके रीडमी के पढ़ने से मेरी प्रारंभिक धारणा है:

  • जैसा कि कोई है जो Microsoft से "वास्तविक" C # Rx से परिचित है, RxSwift बहुत अधिक पहचानने योग्य है।
  • ReactiveCococa अब अपने स्वयं के अंतरिक्ष में चला गया है, सिग्नल और सिग्नलप्रोड्यूसर और लिफ्टिंग जैसे नए सार का परिचय दे रहा है। एक तरफ यह कुछ स्थितियों को स्पष्ट करने के लिए लगता है (एक गर्म बनाम ठंडा संकेत क्या है), लेकिन दूसरी ओर यह फ्रेम की जटिलता को बढ़ाने के लिए बहुत कुछ लगता है

आपका प्रश्न विशेष रूप से "राय" के लिए पूछता है। क्या आप कृपया पुनर्मुद्रण कर सकते हैं? मैं ख़ुशी से अपने करीबी वोट को वापस ले लूंगा।
सुल्तान

2
आप "उनकी राय जोड़ सकते हैं" से छुटकारा पा सकते हैं, क्योंकि मतभेद तथ्य हैं, राय नहीं। फिर आप RAC / RxSwift की कुछ विशेषताओं को पसंद या नापसंद कर सकते हैं, लेकिन अंतर क्रिस्टल स्पष्ट हैं।
bantoJR

1
hahaha, "mods के लिए नोट" के बारे में अच्छी चाल!
यिंग

1
नाम का सवाल: ReactiveCocoa और RxSwift के बीच अंतर। मुझे लगता है कि सब कुछ "तथ्य" बन जाएगा, और यह सवाल विरासत है।
hqt

1
यहां तक ​​कि समाधान के साथ शुरू होता है "यह एक बहुत अच्छा सवाल है।" : |
इयूलियन ओनोफ्रेई

जवाबों:


419

यह एक बहुत अच्छा सवाल है। दोनों दुनिया की तुलना करना बहुत कठिन है। Rx, C #, Java या JS जैसी अन्य भाषाओं में रिएक्टिव एक्सटेंशन्स का एक हिस्सा है।

रिएक्टिव कोकोआ कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग से प्रेरित था , लेकिन पिछले महीनों में, प्रतिक्रियात्मक एक्सटेंशन के साथ- साथ प्रेरित भी बताया गया है । परिणाम एक रूपरेखा है जो आरएक्स के साथ कुछ चीजें साझा करता है, लेकिन एफआरपी में मूल के साथ नाम हैं।

पहली बात यह है कि कॉनल की परिभाषा के अनुसार, न तो RAC और न ही RxSwift कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग कार्यान्वयन हैं । इस बिंदु से सब कुछ कम किया जा सकता है कि कैसे प्रत्येक रूपरेखा साइड इफेक्ट्स और कुछ अन्य घटकों को संभालती है।

चलो समुदाय और मेटा-टेक सामान के बारे में बात करते हैं :

  • RAC एक 3 साल पुरानी परियोजना है, जिसका जन्म बाद में Objective-C पर चल रहे काम को पूरी तरह से छोड़ने के बाद Objective-C में 3.0 रिलीज के लिए Swift (पुलों के साथ) में हुआ।
  • RxSwift कुछ महीने पुरानी परियोजना है और लगता है कि अभी इस समुदाय में एक गति है। एक चीज़ जो RxSwift के लिए महत्वपूर्ण है, वह है रिएक्टिवएक्स संगठन के तहत और यह कि अन्य सभी कार्यान्वयन उसी तरह से काम कर रहे हैं, RxSwift से कैसे निपटना है, यह सीखना Rx.Net, RxJw या RxJS के साथ काम करना आसान काम है और बस एक बात है भाषा वाक्य रचना की। मैं कह सकता हूँ कि दर्शन पर आधारित है एक बार सीखें, हर जगह लागू करें

अब तकनीकी सामान का समय है।

निर्माण / निरीक्षण संस्थाएँ

RAC 3.0 में 2 मुख्य इकाइयाँ हैं, Signalऔर SignalProducer, पहले वाले घटनाओं को प्रकाशित करता है, चाहे कोई ग्राहक संलग्न हो या न हो, दूसरे startको वास्तव में संकेतों / घटनाओं के उत्पादन की आवश्यकता होती है । यह डिजाइन गर्म और ठंडे वेधशालाओं की थकाऊ अवधारणा को अलग करने के लिए बनाया गया है, जो बहुत सारे डेवलपर्स के लिए भ्रम का स्रोत रहा है। यही कारण है कि मतभेदों को कम किया जा सकता है कि वे दुष्प्रभावों का प्रबंधन कैसे करते हैं

RxSwift में, Signalऔर SignalProducerअनुवाद करने पर Observable, यह भ्रामक लग सकता है, लेकिन ये 2 इकाइयाँ वास्तव में Rx दुनिया में एक ही बात हैं। ObservableRxSwift में s के साथ एक डिज़ाइन बनाया गया है, जिसमें यह विचार किया जाता है कि क्या वे गर्म या ठंडे हैं, यह अनावश्यक जटिलता के रूप में ध्वनि कर सकता है, लेकिन एक बार जब आप समझ गए कि वे कैसे काम करते हैं (और फिर से गर्म / ठंडा / गर्म है तो सब्सक्राइब / अवलोकन करते समय दुष्प्रभावों के बारे में है। ) उन्हें वश में किया जा सकता है।

दोनों दुनिया में, सदस्यता की अवधारणा मूल रूप से एक ही है, एक छोटा सा अंतर है जिसे आरएसी ने पेश किया है और वह interruptionघटना है जब एक Signalपूरा होने से पहले निपटा दिया गया है। दोनों प्रकार की घटनाओं को फिर से करने के लिए:

  • Next, नए प्राप्त मूल्य की गणना करने के लिए
  • Error, एक त्रुटि की गणना करने और स्ट्रीम को पूरा करने के लिए, सभी पर्यवेक्षकों को बिना बताए
  • Complete, सभी पर्यवेक्षकों को सदस्यता समाप्त करने के रूप में स्ट्रीम को चिह्नित करने के लिए

इसके अलावा RAC interruptedको भेजा जाता है जब Signalसही ढंग से या त्रुटि के साथ पूरा करने से पहले निपटाया जाता है।

मैन्युअल रूप से लेखन

RAC में, Signal/ SignalProducerकेवल पढ़ने वाली Observableइकाइयाँ हैं , उन्हें बाहर से प्रबंधित नहीं किया जा सकता है, यही बात RxSwift में है। एक चालू करने के लिए Signal/ SignalProducerएक लेख में सक्षम इकाई में, आप का उपयोग करने के pipe()समारोह एक मैन्युअल रूप से नियंत्रित सामग्री वापस करने का। आरएक्स स्पेस पर, यह एक अलग प्रकार कहा जाता है Subject

यदि पढ़ने / लिखने की अवधारणा अपरिचित लगती है, तो Future/ के साथ एक अच्छा सादृश्य Promiseबनाया जा सकता है। A Futureएक रीड-ओनली प्लेसहोल्डर है, जैसे Signal/ SignalProducerऔर Observable, दूसरी ओर, एक Promiseमैन्युअल रूप से, जैसे pipe()और के लिए पूरा किया जा सकता है Subject

शेड्यूलर

यह इकाई दोनों दुनिया में समान अवधारणाओं के समान है, लेकिन RAC केवल धारावाहिक है, इसके बजाय RxSwift सुविधाएँ समवर्ती शेड्यूलर भी हैं।

रचना

रचना रिएक्टिव प्रोग्रामिंग की प्रमुख विशेषता है। धाराओं की रचना करना दोनों रूपरेखाओं का सार है, RxSwift में उन्हें अनुक्रम भी कहा जाता है

RxSwift के सभी नमूदार संस्थाओं प्रकार के होते हैं ObservableType, तो हम के उदाहरण रचना Subjectऔर Observableएक ही ऑपरेटरों के साथ, किसी भी अतिरिक्त चिंता के बिना।

आरएसी अंतरिक्ष पर, Signalऔर SignalProducer2 अलग संस्थाओं कर रहे हैं और हमारे पास करने के लिए liftपर SignalProducerरचना के लिए क्या के उदाहरण के साथ उत्पादन किया जाता है सक्षम होने के लिए Signal। दो संस्थाओं के पास अपने स्वयं के ऑपरेटर हैं, इसलिए जब आपको चीजों को मिलाने की आवश्यकता होती है, तो आपको यह सुनिश्चित करना होगा कि एक निश्चित ऑपरेटर उपलब्ध है, दूसरी तरफ आप गर्म / ठंडे वेधशालाओं के बारे में भूल जाते हैं।

इस भाग के बारे में, कॉलिन एबरहार्ट ने इसे अच्छी तरह से अभिव्यक्त किया:

वर्तमान एपीआई को देखते हुए सिग्नल ऑपरेशन मुख्य रूप से 'अगली' घटना पर केंद्रित होते हैं, जिससे आप विभिन्न थ्रेड्स पर मान, स्किप, विलंब, संयोजन और निरीक्षण कर सकते हैं। जबकि सिग्नल प्रोड्यूसर एपीआई ज्यादातर सिग्नल लाइफसाइकल इवेंट्स (पूर्ण, त्रुटि) से संबंधित है, तब, फ्लैट मैप, टेक यूटिल और कैच सहित संचालन के साथ।

अतिरिक्त

आरएसी की अवधारणा भी है Actionऔर Property, पूर्व साइड इफेक्ट्स की गणना करने के लिए एक प्रकार है, मुख्य रूप से उपयोगकर्ता इंटरैक्शन से संबंधित है, बाद वाला दिलचस्प है जब किसी कार्य को करने के लिए एक मान का निरीक्षण किया जाता है जब मूल्य बदल गया है। RxSwift में Actionअनुवादों को फिर से एक में Observable, यह अच्छी तरह से दिखाया गया है RxCocoa, दोनों iOS और मैक के लिए Rx आदिम का एकीकरण। RAC का RxSwift में Propertyअनुवाद किया जा सकता है Variable(या BehaviourSubject)।

यह समझना महत्वपूर्ण है कि Property/ Variableजिस तरह से हमें प्रतिक्रियाशील प्रोग्रामिंग की घोषणात्मक प्रकृति के लिए अनिवार्य दुनिया को पाटना है, इसलिए कभी-कभी एक मौलिक घटक होता है जब आईओएस / मैक स्थान के तीसरे पक्ष के पुस्तकालयों या मुख्य कार्यात्मकताओं से निपटते हैं।

निष्कर्ष

RAC और RxSwift 2 पूर्ण भिन्न जानवर हैं, पूर्व में कोको स्थान में एक लंबा इतिहास है और बहुत सारे योगदानकर्ता हैं, बाद वाला काफी युवा है, लेकिन उन अवधारणाओं पर निर्भर करता है जो जावा, जेएस या अन्य भाषाओं में प्रभावी साबित हुई हैं। नेट। जो निर्णय बेहतर है वह वरीयता पर है। RAC बताता है कि गर्म / ठंडा देखने योग्य का पृथक्करण आवश्यक था और यही फ्रेमवर्क की मुख्य विशेषता है, RxSwift का कहना है कि उनका एकीकरण पृथक्करण से बेहतर है, फिर से यह है कि कैसे साइड इफेक्ट्स का प्रबंधन / प्रदर्शन किया जाता है।

लगता है कि आरएसी 3.0 ने गर्म / ठंडे वेधशालाओं को अलग करने के प्रमुख लक्ष्य के ऊपर कुछ अप्रत्याशित जटिलता पेश की है, जैसे रुकावट की अवधारणा, 2 संस्थाओं के बीच संचालकों को विभाजित करना और कुछ अनिवार्य व्यवहार startशुरू करना जैसे संकेतों का उत्पादन शुरू करना। कुछ लोगों के लिए ये चीजें एक अच्छी बात हो सकती हैं या यहां तक ​​कि एक हत्यारा सुविधा भी, कुछ अन्य लोगों के लिए वे सिर्फ अनावश्यक या खतरनाक भी हो सकते हैं। याद रखने वाली एक और बात यह है कि आरएसी जितना संभव हो सके कोको सम्मेलनों को बनाए रखने की कोशिश कर रहा है, इसलिए यदि आप एक अनुभवी कोको देव हैं, तो आपको RxSwift के बजाय इसके साथ काम करने में अधिक सहज महसूस करना चाहिए

दूसरी ओर RxSwift सभी डाउनसाइड्स जैसे हॉट / कोल्ड ऑब्जर्वबल्स के साथ रहती है, लेकिन रिएक्टिव एक्सटेंशन्स की अच्छी चीजें भी। RxJS, RxJava या Rx.Net से RxSwift पर जाना एक साधारण बात है, सभी अवधारणाएं समान हैं, इसलिए यह सामग्री को काफी रोचक बनाती है, हो सकता है कि अब आप जिस समस्या का सामना कर रहे हैं, वह RxJava और समाधान में किसी के द्वारा हल की गई हो। मंच को ध्यान में रखते हुए फिर से लागू किया जा सकता है।

किसी एक को चुना जाना निश्चित रूप से प्राथमिकता का विषय है, उद्देश्य से, यह बताना असंभव है कि कौन सा बेहतर है। एकमात्र तरीका यह है कि Xcode को आग लगाई जाए और उन दोनों को आज़माएं और जिस काम को करने के लिए अधिक सहज महसूस करते हैं उसे चुनें। वे समान अवधारणाओं के 2 कार्यान्वयन हैं, एक ही लक्ष्य को प्राप्त करने की कोशिश कर रहे हैं: सॉफ्टवेयर विकास को सरल बनाना।


24
यह एक महान स्पष्टीकरण है, @ जूनियर-बी! हालांकि, यह भी ध्यान देने योग्य बात है कि आरएसी टाइप NoErrorप्रकारों में स्वयं ( Signal<T, E: ErrorType>बनाम त्रुटियों की कमी सहित) जानकारी टाइप करता है : बनाम Observable<T>। यह, साथ ही गर्म / ठंडा जुदाई, संकलन समय पर जानकारी की एक बढ़ी हुई मात्रा प्रदान करता है जो आपके पास नहीं है RxSwift
नाचोसोटो

3
हाय @nachosoto, इस तरह के शब्द के लिए धन्यवाद। मुझे लगता है कि प्रतिक्रियाशील प्रोग्रामिंग पर एक तुलना में प्रस्तावित जोड़ इतनी अच्छी तरह से फिट नहीं होगा। यह निश्चित रूप से आरएसी के पक्ष में एक अच्छा जोड़ है, लेकिन मेरे लिए आरपी डेटा प्रवाह प्रोग्रामिंग को सरल बनाने के बारे में है और महत्वपूर्ण कारक हैं: त्रुटि से निपटने, अतुल्यकालिक गणना, साइड इफेक्ट्स प्रबंधन और संरचना। डेवलपर के दृष्टिकोण से यह एक अच्छी विशेषता है, यह कोड पर त्रुटि प्रकार को स्पष्ट करने के लिए है, यह वास्तव में फ्रेमवर्क के त्रुटि हैंडलिंग पहलू में सुधार नहीं कर रहा है, यह निश्चित रूप से मेरी विनम्र राय है।
बोंटूजैआर

3
यह ध्यान देने योग्य है कि अब तक आरएसी पर सभ्य ट्यूटोरियल की कमी है, हालांकि आरएक्सविफ्ट के लिए कुछ महान नमूना परियोजनाएं हैं जो मेरे लिए निर्णायक थीं।
वादिम बुलाविन

1
ReactiveCocoa अच्छा था, जब तक कि उन्होंने फ्री फ़ंक्शंस, सिग्नलप्रोड्यूसर, त्रुटि के साथ सामान्य परिचय नहीं दिया। मैं RxSwift सीखता हूं और RxKotlin, RxJS
onmyway133
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.