2016-01-08 12 views
10

मैं एक परियोजना को आरएक्सस्विफ्ट और एमवीवीएम का उपयोग करने की कोशिश कर रहा हूं। मेरे पास एक ऐसी सेवा है जो प्रत्येक ऐप लॉन्च पर पार्स से डेटा की एक सूची को सिंक करता है और मैं मूल रूप से यह सुनिश्चित करना चाहता हूं कि मैं सही दृष्टिकोण ले रहा हूं।आरएक्सस्विफ्ट चर का उपयोग कर

मैंने जो किया है वह एक परिवर्तनीय विषय बना दिया गया है और फिर मेरे मॉडल को यह सुनने की अनुमति देता है। ParseService:

let rx_parseMushrooms = Variable<[ParseMushroom]>([]) 

MushroomLibraryModel:

_ = parseService.rx_parseMushrooms 
    .asObservable() 
    .map { (parseMushrooms:[ParseMushroom]) -> [Mushroom] in 
     let mushrooms = parseMushrooms.map { (parseMushroom:ParseMushroom) -> Mushroom in 
      let mushroom = Mapper<Mushroom>().map(parseMushroom.dictionaryWithValuesForKeys(parseMushroom.allKeys())) 
      return mushroom! 
     } 

     return mushrooms 
    } 
    .subscribeNext({ (mushrooms:[Mushroom]) -> Void in 
     self.mushrooms = mushrooms 
     print(mushrooms) 
    }) 

मैं सिंक स्थिति को व्यक्त करने के लिए भी ऐसा ही।

ParseService:

struct SyncState { 
    enum State { 
     case Unsynced, ConnectingToServer, SyncingInfo, FetchingImageList, SyncingImages, SyncComplete, SyncCompleteWithError 
    } 

    var infoToSync = 0 
    var imagesToSync = 0 
    var imagesSynced = 0 

    var state = State.Unsynced 
} 

let rx_syncState = Variable(SyncState()) 

मैं तो चर एक ला

self.rx_syncState.value = self.syncState 

SyncViewModel अद्यतन:

_ = parseService.rx_syncState 
    .asObservable() 
    .subscribeNext { [weak self] (syncState:ParseService.SyncState) -> Void in 
      switch syncState.state { 
       //show stuff based on state struct 
      } 
     } 

फिर भी मैं बहुत आभारी होंगे अगर कोई मुझे बता सकते हैं अगर यह है इसके बारे में जाने का एक अच्छा तरीका या यदि मैं आरएक्सस्विफ्ट का दुरुपयोग कर रहा हूं (और मुझे मार्गदर्शन करें कि मुझे कैसे करना चाहिए एस ...)

चीयर्स!

उत्तर

7

हम्म ... यहाँ चर का उपयोग कर के बारे में एक लेख (ध्यान दें कि चर BehaviorSubject के चारों ओर एक आवरण है।)

http://davesexton.com/blog/post/To-Use-Subject-Or-Not-To-Use-Subject.aspx

आपके मामले में, आप पहले से ही एक ठंडा नमूदार (नेटवर्क फोन है, है) तो आपको विषय/परिवर्तनीय की आवश्यकता नहीं है। आपको बस इतना करना है कि आपके पास पहले से मौजूद अवलोकन योग्य है और मूल्य को कैश करने के लिए रीप्ले (1) का उपयोग करें। मैं ParseServer जैसे किसी वर्ग की अपेक्षा करता हूं जिसमें mushrooms जैसी कुछ गणना वाली संपत्ति शामिल है।

मदद करने के लिए पार्स से बाहर मशरूम मिलता है, आप का उपयोग इस (इस ठंड नमूदार आप की जरूरत पैदा करेगा) कर सकते हैं:

extension PFQuery { 

    var rx_findObjects: Observable<[PFObject]> { 
     return Observable.create { observer in 
      self.findObjectsInBackgroundWithBlock({ results, error in 
       if let results = results { 
        observer.on(.Next(results)) 
        observer.on(.Completed) 
       } 
       else { 
        observer.on(.Error(error ?? RxError.Unknown)) 
       } 
      }) 
      return AnonymousDisposable({ self.cancel() }) 
     } 
    } 

} 

और फिर आप की तरह कुछ होगा:

class ParseServer { 
    var mushrooms: Observable<[Mushroom]> { 
     return PFQuery(className: "Mushroom").rx_findObjects 
     .map { $0.map { Mushroom(pfObject: $0) } } 
     .publish() 
     .replay(1) 
    } 
} 

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

विचार यह है कि पहली बार जब आप myParseServer.mushrooms पर कॉल करते हैं तो सिस्टम मर्सरूम को बाहर निकालने और उन्हें कैश करने के लिए पार्स को कॉल करेगा। तब से, यह पिछले कैश किए गए मशरूम को वापस कर देगा।

+0

बहुत बढ़िया और उत्तर के लिए धन्यवाद :) सिंक राज्य भाग के बारे में क्या? असल में मेरे पास एक सेवा वर्ग है जो लाइब्रेरी सिंक होने तक सामान का एक गुच्छा करता है। यह "सिंक लाइब्रेरी()" विधि ऐप लॉन्च पर कॉल की जाती है लेकिन मुझे लगता है कि नए मशरूम उपलब्ध होने पर कई वर्ग सिंक की स्थिति को सुन सकेंगे। मेरे पास प्रारंभिक स्क्रीन भी है जिसमें मैं सिंक की प्रगति दिखाता हूं। क्या आप सिंक लाइब्रेरी को एक var भी बनायेंगे? यह ऐप बीटीडब्ल्यू है अगर यह बेहतर बताता है कि मैं goo.gl/xJaV0d क्या कर रहा हूं, यह पहले से ही बाहर है, मैं सिर्फ आरएक्सस्विफ्ट को मास्टर करने की कोशिश कर रहा हूं, यह मेरे दिमाग को उड़ता रहता है .. – Manny

+0

कूल लग रहा ऐप।जैसा कि मैंने संदर्भित लेख की तरह कहा है, आपको शायद ही कभी विषयों (चर सहित) की आवश्यकता है। मुझे लगता है कि वे मुख्य रूप से उस समय के लिए लाइब्रेरी में हैं जब आपके पास कुछ ऐसा है जो उदाहरण के लिए कॉल बैक के बजाय प्रतिनिधि लेता है और आप इसे एक रूप में परिवर्तित करना चाहते हैं आरएक्स स्ट्रीम। –

+0

सिंक्रनाइज़ेशन के मामले में, आपका डीबी कोड पहले से ही लपेटा जाना चाहिए ताकि यह अवलोकन योग्य हो। जैसा कि मैंने पीएफओबीजेक्ट के लिए ऊपर किया था। विषयों को कुछ भी नहीं से गर्म अवलोकन करने के लिए हैं। आपका डीबी गर्म अवलोकनों को उत्पन्न नहीं करना चाहिए। –

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