2016-01-06 20 views
43

तो, मैं, किसी एप्लिकेशन (आईओएस, स्विफ्ट) में एक 'retweet' की तरह कार्यक्षमता को लागू करने Parse उपयोग करने के साथ काम सौंपा गया है।parse.com 'रीट्वीट' पैटर्न भी वर्बोज़ है

यह here से पहले पूछा गया है, लेकिन यह एक है) बहुत उच्च स्तर और बी) मुझे यह काम मिल रहा है - मैं वास्तुशिल्प निर्णयों पर मदद मांगना नहीं चाहता हूं, हालांकि ऐसा लगता है कि मैं स्पष्ट रूप से गायब हूं कुछ, मुझे फीडबैक स्वीकार करने में खुशी है।

मेरे ऐप में CAUSES हैं जो प्रत्येक उपयोगकर्ता द्वारा बनाए गए हैं। एक TO और उपयोगकर्ता से एक FOLLOW तालिका भी है। तो शुरू करने के लिए, मैं बस सीएयूएसईएस तालिका से पूछताछ करता हूं कि जिस उपयोगकर्ता ने पोस्ट किया है, उसे उस तालिका से उपयोगकर्ता से मिलान करना चाहिए (जहां वर्तमान उपयोगकर्ता उपयोगकर्ता से है)। अधिक संक्षेप में:

let getFollowedUsersQuery = PFQuery(className: Constants.kParseClassFollowers) 
getFollowedUsersQuery.whereKey(Constants.kParseFieldFromUser, equalTo: PFUser.currentUser()!) 

let causesQuery = PFQuery(className: Constants.kParseClassCauses) 
causesQuery.whereKey(Constants.kParseFieldFromUser, matchesKey: Constants.kParseFieldToUser, inQuery: getFollowedUsersQuery) 
causesQuery.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in 
    if let causes = objects { 
     for cause in causes { 
      // populate the tableview cells, etc. 
     } 
    } 
}) 

अब मेरे पास उन उपयोगकर्ताओं के सभी कारण हैं जिनका मैं पालन करता हूं ... यह सब कुछ मानक है।

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

मैं, एक सुरुचिपूर्ण समाधान खोजने के लिए अभी तक है, हालांकि मैं एक 'जानवर बल' एक के करीब पहुंच रहा हूँ, और यह इतना बोझिल और वर्बोज़ कि मेरी प्रोग्रामर के मस्तिष्क का बेहतर आधा screaming at me like Susan Powter है ...

यहाँ एक है नमूना:

let retweetQuery = PFQuery(className: Constants.kParseClassCauses) 
retweetQuery.orderByDescending(Constants.kParseFieldCreatedAt) 
retweetQuery.whereKey(Constants.kParseFieldFromUser, notEqualTo: PFUser.currentUser()!) 
retweetQuery.whereKey(Constants.kParseFieldFromUser, doesNotMatchKey: Constants.kParseFieldToUser, inQuery: getFollowedUsersQuery) 
retweetQuery.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in 
    if let causes = objects { 
     for cause in causes { 
      let supporterRelations = cause.relationForKey(Constants.kParseClassSupporters) 
      let supporterQuery = supporterRelations.query() 
      supporterQuery.findObjectsInBackgroundWithBlock { (supporters, error) in 
       if(error == nil && supporters?.count > 0) { 
        for supporter in supporters! { 
         let user:PFUser = supporter as! PFUser 
         getFollowedUsersQuery.whereKey(Constants.kParseFieldToUser, equalTo: user) 
         getFollowedUsersQuery.whereKey(Constants.kParseFieldFromUser, equalTo: PFUser.currentUser()!) 
         getFollowedUsersQuery.findObjectsInBackgroundWithBlock({ (results, error) -> Void in 
          if(error == nil && results?.count > 0) { 
           for result in results! { 
            // do stuff 
           } 
          } 
         }) 
        } 
       } 
      } 
     } 
    } 
}) 

अब, यह शुद्ध पागलपन, और अविश्वसनीय रूप से बेकार है (विशेष रूप से विचार कर रहा है कि कैसे पार्स मुक्त स्तरीय गणना करता है - मुझे लगता है यह वास्तव में मेरे एपीआई सीमित करने के लिए भारी योगदान कर सकता है, तो उत्पादन करने के लिए धक्का दिया)।

पहले से ही दो प्रश्नों किया, मैं फिर से करना एक पूरी तरह से है, तो समर्थक संबंधों पर प्रत्येक कारण के लिए किसी अन्य क्वेरी करते हैं, तो उस संबंध में प्रत्येक उपयोगकर्ता पर किसी अन्य क्वेरी कर अगर मैं उन्हें का पालन करें देखने के लिए ... और एक बार मेरे पास यह जानकारी हो जाने के बाद, मुझे उस उपयोगकर्ता के समर्थित कारणों के माध्यम से लूप करना होगा (पार्स प्रश्नों की असीमित वापसी की वजह से, मुझे नहीं लगता कि मैं केवल माता-पिता के लूप में वापस पहुंच सकता हूं) ... जो मैं अभी तक लागू नहीं किया है, क्योंकि मैं तौलिया में फेंकने वाला हूं - एक बेहतर तरीका होना चाहिए!

मुझे आशा है कि मैं एक रणनीति यहाँ याद कर रहा हूँ ...

+4

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

+1

हाँ, यह समझ में आता है ... मैं इसे एक विकल्प के रूप में एक्सप्लोर करूंगा। –

+2

मैं इस ढांचे से परिचित नहीं हूं, लेकिन अर्थशास्त्र को बदलने के बिना, आप सिंटैक्स को थोड़ा सरल बना सकते हैं। मैं आमतौर पर लिखता हूं 'अगर x = y {के लिए मैं x में ... {'' के रूप में मैं y में ?? [] {... '। मैं 'अगर त्रुटि == शून्य ... '' गार्ड त्रुटि के साथ बदलना चाहूंगा! = शून्य और {वापसी} '। वे दो आपको लाइनों को नहीं बचाएंगे, लेकिन वे आपको कॉलम सहेजते हैं: इससे इंडेंटेशन के 9 स्तरों से 6 तक आपके भीतर की '// डू स्टफ' कम हो जाएगी, जो * पागल नहीं है। –

उत्तर

1

@ jesses.co.tt मैं माफी चाहता हूँ कि अगर यह है बहुत कम बहुत देर हो चुकी है, मैं निश्चित रूप से ध्यान दें कि मैं इस का उत्तर देते ले पूछे जाने के कुछ महीने बाद, लेकिन मुझे लगता है कि यह सामान्य रूप से उत्तर देने योग्य है (और हो सकता है कि यह अभी भी आपके लिए मूल्यवान हो)।

आम तौर पर, मैं 100% सहमत हूं कि पारसे के साथ यह ट्रिपल क्वेरी एक है) जिस तरह से इसे बिल किया गया है (पुराने सिस्टम में) और बी) इसे ध्यान में रखते हुए, गलत दृष्टिकोण की तरह लगता है स्वयं-होस्टेड पार्स (जो इस बिंदु पर प्रयोगात्मक रूप से उपयोग करने योग्य एकमात्र तंत्र है क्योंकि पार्स अब बंद हो गया है, लेकिन मुझे लगता है कि सवाल तब भी संभव होगा जब प्रश्न पूछा गया था ... परवाह किए बिना ...)। ऐसे 2 समाधान हैं जो मैं देखता हूं जो इसे एक साफ तरीके से ठीक कर सकते हैं, मानते हैं कि ये परिवर्तन सामान्य स्कीमा/आर्किटेक्चर में किए जा सकते हैं।

1) एक पहला समाधान डेटा सेट फिर से schematize और अनिवार्य रूप से "विदेशी कुंजी" समर्थकों प्रत्येक UserUser तालिका अपने आप में है के सबसेट की है। इस तरह, Cause से जाने के बजाय ->Supporter ->User, आप सैद्धांतिक रूप से Cause ->User (जहां उपयोगकर्ताओं से, आप डिफ़ॉल्ट रूप से उनके समर्थक प्राप्त करेंगे क्योंकि यह वहां एक स्तंभ होगा)। Parse में ऐसा करने के लिए, यदि मुझे सही याद है तो आप एक निश्चित प्रकार की सरणी के रूप में एक कॉलम सेट कर सकते हैं, और उसके बाद object लिंक हैं (जो पार्स डैशबोर्ड में अच्छी तरह से दिखाई देते हैं) जो वास्तविक Supporter तालिका हैं ऑब्जेक्ट्स, लेकिन उस User तालिका में उस तालिका के लिंक के इस कॉलम को बनाए रखना।

है, write तरफ एक थोड़ा और अधिक काम है, क्योंकि आप मैन्युअल रूप से ऐसा करने के लिए (स्वयं मेरा मतलब है लिखने कोड अपने आप को कि, यह स्वचालित किया जाना चाहिए करने के लिए से होगा लेकिन ऐसा नहीं होगा विकास के मामले में मुफ्त में होता है)। इस से थोड़ा अधिक अग्रिम write आपरेशन के साथ, आप तो एक 2 कदम read बजाय 3.

2) एक दूसरा समाधान, इस प्रकार का डेटा के लिए एक अलग प्रदाता का उपयोग करने के लिए क्वेरी गति है अगर है एक मुद्दा। अपनी परियोजनाओं के कई में मैं डेटा क्वेरी देखने के इस प्रकार के लिए सॉकेट आधारित दृष्टिकोण Firebase (दोनों "सभी समग्रता 'की बहुत विभिन्न स्तरों, Firebase उपयोग करें, और Pusher या की तरह सोचता है कि और अधिक एक पार्स की तरह लेकिन से किया जा रहा है Google इस बार, Pusher थोड़ा अधिक बुनियादी और "DIY" होने के नाते)।

साथ Firebase, उदाहरण के लिए, और इस डेटा सेट + एक स्कीमा जिसमें Cause तालिका ही क्या User रों उन्हें (करने के लिए और जो User से संबंधित की एक कैश है करने के लिए एक सॉकेट उनके Supporter रों की एक कैश है), यह 3 कदम देखो प्रभावी रूप से 2 पैरामीटर के साथ 1 क्वेरी हो सकता है (जो मुझे आदर्श परिदृश्य लगता है)। मेरा मानना ​​है कि इसे पारसे के साथ भी हासिल किया जा सकता है, लेकिन पहले प्रस्तावित समाधान में स्कीमा रिफैक्टरिंग के एक और चरण की आवश्यकता होगी।

मुझे लगता है कि टिप्पणियों में कुछ इसी तरह की सिफारिश की जाती है (समाधान के ऊपर दोनों) लेकिन एक बहुत अधिक विस्तृत प्रारूप में। मुझे उम्मीद है कि यह मूल प्रश्न पूछने वाले या किसी की मदद करता है। यह भी सैद्धांतिक रूप से, के रूप में किसी की सिफारिश की, PubNub इस्तेमाल कर सकते हैं 1 टिप्पणी के रूप में उल्लेख किया है, लेकिन यह सिर्फ के रूप में आसानी डीबी एडब्ल्यूएस पर होस्ट एक PostgreSQL में इस स्कीमा या Heroku बना सकते हैं और बिना पार्स के रूप में ठीक उसी तंत्र को पूरा ऊपरी भाग

इसके अलावा, के बाद से इस संदर्भ पार्स करने के लिए जो अब केवल एक मुक्त स्रोत स्वयं की मेजबानी समाधान के रूप में की पेशकश की है में है, यहाँ किसी के एडब्ल्यूएस पर दम पर पार्स की मेजबानी करने के लिए स्थानांतरित करने के लिए एक गाइड है: link here

+0

महान उत्तर, जल्द ही समीक्षा करेगा! धन्यवाद! –

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