2017-03-05 11 views
5

मेरे पास रिले के साथ एकीकृत एक वास्तविक मूल ऐप है और मैं उपयोगकर्ताओं के लिए ऑफलाइन-पहला अनुभव डिलीवरी करना चाहता हूं।प्रतिक्रिया-मूल ऐप पर रिले कैश डेटा का उपयोग करें, जबकि ताजा डेटा लाया जा रहा है

तो, पहले ऐप लॉन्च में डेटा प्ले लोड होने पर प्लेसहोल्डर को दिखाया जाना चाहिए। इसके बाद, हर बार ऐप लॉन्च होने पर मैं एक नया डेटा लोड होने पर अंतिम कैश डेटा दिखाना चाहता हूं।

मैं this issue from 2015 पाया जाता है और पर eyston's answer आधारित मैं AsyncStorage का उपयोग कर relay-cache-manager पर एक CacheManager आधारित लागू करने के लिए कोशिश की है। कैशमैनेजर के साथ मैं कैश से रिले रिकॉर्ड्स को सहेज और लोड कर सकता हूं लेकिन जब नेटवर्क अक्षम हो जाता है तो ऐप कैश डेटा दिखाने में सक्षम नहीं होता है।

रिले कैश डेटा का उपयोग करने का कोई तरीका है जबकि रिले ताजा डेटा ला रहा है?

उत्तर

5

हमारे पास एक उत्पादन ऐप है जो ऑफ़लाइन अनुभव के लिए रिले और RealmDB का उपयोग करता है। हमने कैशमेनगर से एक अलग दृष्टिकोण लिया क्योंकि उस समय कैशमैनगर बिल्कुल तैयार नहीं था। हमने इसके लिए relay-local-schema का उपयोग किया।

हमने रिले-स्थानीय-स्कीमा का उपयोग कर मोबाइल के लिए आवश्यक संपूर्ण स्कीमा परिभाषित किया है। यह वही फ़ाइल हो सकता है जैसे आपका बैकएंड सर्वर ग्राफ़क्ल स्कीमा को परिभाषित करने के लिए उपयोग करेगा और वास्तविक डीबी से डेटा को हल करने के लिए समाधान फ़ंक्शन को बदल देगा। इसके लिए हमने realmdb में स्कीमा भी बनाया था, जिसमें रीयलएमडीबी पर बैकएंड सर्वर द्वारा लौटाए गए डेटा लिखने की सादगी के लिए ग्राफक्ल स्कीमा के लगभग समान संरचना थी। आप graphql आत्मनिरीक्षण क्वेरी का उपयोग करके इस स्कीमा को उत्पन्न करने को भी स्वचालित कर सकते हैं। हमने custom network layer को परिभाषित किया जहां हमने सुनिश्चित किया कि सभी रिले प्रश्न हमेशा स्थानीय डीबी को स्पर्श करते हैं। sendQueries फ़ंक्शन में सभी प्रश्नों को रिले-स्थानीय-स्कीमा के साथ हल किया जाता है जो बहुत तेज़ी से हल हो जाते हैं और प्रतिक्रिया दृश्य पुराने डेटा दिखाते हैं और साथ ही sendQueries फ़ंक्शन में प्रत्येक अनुरोध के लिए नेटवर्क अनुरोध किया जाता है। नेटवर्क अनुरोध से डेटा प्राप्त करने पर यह realmdb में लिखा गया है और रिले इन-मेमोरी स्टोर भी नए डेटा के साथ पॉप्युलेट किया गया है, यह स्वचालित रूप से उन सभी प्रतिक्रिया दृश्यों को रीफ्रेश करता है जिनके डेटा बदल गए हैं। में-स्मृति की दुकान रिले के लिए डेटा लिखने के लिए हम निम्नलिखित अप्रलेखित विधि का इस्तेमाल किया

Relay.Store.getStoreData().handleQueryPayload(query, response); 

आप अनुरोध है कि आप sendQueries समारोह में प्राप्त request.getQuery() का उपयोग करने से क्वेरी वस्तु प्राप्त कर सकते हैं।

हमारा वर्तमान कार्यान्वयन हमारे व्यापार तर्क से जुड़ा हुआ है और इसलिए इस तर्क को स्रोत खोलना मुश्किल है। मैं एक डेमो ऐप प्रदान करने की कोशिश करूंगा।

+0

आपकी त्वरित प्रतिक्रिया @meteors के लिए धन्यवाद। मैंने रिले-स्थानीय-स्कीमा का उपयोग करने के बारे में सोचा, लेकिन मैंने छोड़ दिया क्योंकि मुझे अपने ऐप पर 'GraphQLSchema' आयात करने का विचार पसंद नहीं आया (स्कीमा को एक अलग परियोजना में परिभाषित किया गया है और मैं नहीं चाहता इसे बांधो)। आपकी प्रतिक्रिया के बाद मुझे [जेसन-टू-ग्राफक्ल-स्कीमा] (https://github.com/aweary/json-to-graphql) भंडार मिला। मैं बैबेल-रिले-प्लगइन द्वारा उपयोग की जाने वाली जेसन स्कीमा का उपयोग करने की कोशिश करूंगा। –

+0

आपके कार्यान्वयन को देखना अच्छा लगेगा। मुझे पता है कि कोड से अपने व्यावसायिक तर्क को अलग करना और डेमो के साथ एक रिपोजिटरी बनाना मुश्किल हो सकता है, इसलिए यदि आप कस्टम नेटवर्क परत और रीयलएमडी अपडेट के नमूना कोड के साथ एक गिस्ट बना सकते हैं तो मैं सराहना करता हूं। कोड को काम करने की आवश्यकता नहीं है = डी। वैसे भी, मैं स्थानीय स्कीमा के साथ दृष्टिकोण का प्रयास करूंगा। जब मैं कुछ प्रगति करता हूं तो मैं यहां अपडेट करूंगा। –

+0

ठीक है, मैं जल्द ही एक गिस्ट या डेमो ऐप जोड़ने की कोशिश करूंगा। – meteors

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