2017-06-06 11 views
5

मेरे पास फायरबेस रीयलटाइम डेटाबेस का उपयोग करके आईओएस स्विफ्ट ऐप है। यदि मैं आमतौर पर ऐप का उपयोग करता हूं तो मुझे कोई समस्या नहीं मिल रही है। हालांकि, मैं किनारे के मामलों की उम्मीद करना चाहता हूं।फायरबेस रीयलटाइम ऐरे गिनती मिस्चैच

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

मैं अपने Firebase कंसोल में एक tableview मेरी सिम्युलेटर पर खुला और जा रहा होने और मैन्युअल रूप से एक मूल्य बदल रहा है और तुरन्त डिवाइस पर स्ट्रिंग परिवर्तन से मेरे ऐप का परीक्षण किया है।

तो मैं क्यों मेरे tableview बच्चों की एक गलत राशि दिखाने अगर यह लगातार जाँच कर रहा है क्या मूल्य होना चाहिए होता है के रूप में उलझन में हूँ।

// MARK: Firebase Methods 

func checkIfDataExits() { 
    DispatchQueue.main.async { 
     self.cardArray.removeAll() 
     self.ref.observe(DataEventType.value, with: { (snapshot) in 
      if snapshot.hasChild("cards") { 
       self.pullAllUsersCards() 
      } else { 
       self.tableView.reloadData() 
      } 
     }) 
    } 
} 



func pullAllUsersCards() { 
    cardArray.removeAll() 
    let userRef = ref.child("users").child((user?.uid)!).child("cards") 
    userRef.observe(DataEventType.value, with: { (snapshot) in 
     for userscard in snapshot.children { 
      let cardID = (userscard as AnyObject).key as String 
      let cardRef = self.ref.child("cards").child(cardID) 
      cardRef.observe(DataEventType.value, with: { (cardSnapShot) in 
       let cardSnap = cardSnapShot as DataSnapshot 
       let cardDict = cardSnap.value as! [String: AnyObject] 
       let cardNickname = cardDict["nickname"] 
       let cardType = cardDict["type"] 
       let cardStatus = cardDict["cardStatus"] 
       self.cardNicknameToTransfer = cardNickname as! String 
       self.cardtypeToTransfer = cardType as! String 
       let aCard = CardClass() 
       aCard.cardID = cardID 
       aCard.nickname = cardNickname as! String 
       aCard.type = cardType as! String 
       aCard.cStatus = cardStatus as! Bool 
       self.cardArray.append(aCard) 
       DispatchQueue.main.async { 
        self.tableView.reloadData() 
       } 
      }) 
     } 
    }) 
} 
+0

मैं numberOfItemsInSection या कुछ और पर एक firebase विधि का उपयोग करने की आवश्यकता है? – RubberDucky4444

+0

सुनिश्चित नहीं है कि हम पर्याप्त कोड देख रहे हैं। ViewDid/WillAppear जैसी चीजें टेबल विधियों वाले सरणी पर टेबल विधियों और किसी भी सेटटर/गेटर गुणों के रूप में उपयोगी होंगी। आम तौर पर जब किसी तालिका में डुप्लिकेट डेटा के साथ समस्याएं होती हैं, तो ऐसा इसलिए होता है क्योंकि तालिका के डेटा सरणी को पुनः लोड होने से पहले साफ़ नहीं किया जा रहा है। जैसा कि आप दो अलग-अलग विचारों के बीच आगे और आगे जा रहे हैं, उदाहरण में कुछ भी देखें, उदाहरण के लिए, प्रत्येक बार जब आप तालिका दृश्य पर वापस स्विच करेंगे तो उसे कॉल किया जाएगा। – C6Silver

उत्तर

4

मैं मदद मिली और मेरे कोड काफी बदल, इसलिए अब यह काम करता है

func checkIfDataExits() { 
    self.ref.observe(DataEventType.value, with: { (snapshot) in 
     if snapshot.hasChild("services") { 
      self.pullCardData() 
     } else { 
      DispatchQueue.main.async { 
       self.collectionView.reloadData() 
      } 
     } 
    }) 
} 


func pullCardData() { 
    let cardRef = self.ref.child("cards") 
    cardRef.observe(DataEventType.value, with: { (snapshot) in 
     for cards in snapshot.children { 
      let allCardIDs = (cards as AnyObject).key as String 
      if allCardIDs == self.cardID { 
       if let childId = self.cardID { 
        let thisCardLocation = cardRef.child(childId) 
        thisCardLocation.observe(DataEventType.value, with: { (snapshot) in 
         let thisCardDetails = snapshot as DataSnapshot 
         if let cardDict = thisCardDetails.value as? [String: AnyObject] { 
          self.selectedCard?.cardID = thisCardDetails.key 
          self.selectedCard?.nickname = cardDict["nickname"] as? String ?? "" 
          self.selectedCard?.type = cardDict["type"] as? String ?? "" 
          self.pullServicesForCard() 
         } 
        }) 
       } 
      } 
     } 
    }) 
} 

func pullServicesForCard() { 
    if let theId = self.cardID { 
     let thisCardServices = self.ref.child("cards").child(theId).child("services") 
     thisCardServices.observe(DataEventType.value, with: { (serviceSnap) in 
      if self.serviceArray.count != Int(serviceSnap.childrenCount) { 
       self.serviceArray.removeAll() 
       self.fetchAndAddAllServices(serviceSnap: serviceSnap, index: 0, completion: { (success) in 
        if success { 
         DispatchQueue.main.async { 
          self.collectionView.reloadData() 
         } 
        } 
       }) 
      } 
     }) 
    } 
} 

func fetchAndAddAllServices(serviceSnap: DataSnapshot, index: Int, completion: @escaping (_ success: Bool) -> Void) { 
    if serviceSnap.hasChildren() { 
     if index < serviceSnap.children.allObjects.count { 
      let serviceChild = serviceSnap.children.allObjects[index] 
      let serviceID = (serviceChild as AnyObject).key as String 

      let thisServiceLocationInServiceNode = self.ref.child("services").child(serviceID) 

      thisServiceLocationInServiceNode.observeSingleEvent(of: DataEventType.value, with: { (thisSnap) in 
       let serv = thisSnap as DataSnapshot 

       if let serviceDict = serv.value as? [String: AnyObject] { 

        let aService = ServiceClass(serviceDict: serviceDict) 
        self.serviceCurrent = serviceDict["serviceStatus"] as? Bool 
        self.serviceName = serviceDict["serviceName"] as? String ?? "" 
        self.serviceURL = serviceDict["serviceURL"] as? String ?? "" 
        self.serviceFixedBool = serviceDict["serviceFixed"] as? Bool 
        self.serviceFixedAmount = serviceDict["serviceAmount"] as? String ?? "" 
        self.attentionInt = serviceDict["attentionInt"] as? Int 

        self.totalArr.append((serviceDict["serviceAmount"] as? String)!) 
        //      self.doubleArray = self.totalArr.flatMap{ Double($0) } 
        //      let arraySum = self.doubleArray.reduce(0, +) 
        //      self.title = self.selectedCard?.nickname ?? "" 

        //      if let titleName = self.selectedCard?.nickname { 
        //       self.title = "\(titleName): \(arraySum)" 
        //      } 

        aService.serviceID = serviceID 
        if serviceDict["serviceStatus"] as? Bool == true { 
         self.selectedCard?.cStatus = true 
        } else { 
         self.selectedCard?.cStatus = false 
        } 



        if !self.serviceArray.contains(where: { (service) -> Bool in 
         return service.serviceID == aService.serviceID 
        }) { 
         self.serviceArray.append(aService) 

         self.serviceArray.sort {$1.serviceAttention < $0.serviceAttention} 

        } 
       } 
       self.fetchAndAddAllServices(serviceSnap: serviceSnap, index: index + 1, completion: completion) 
      }) 

     } 
     else { 
      completion(true) 
     } 
    } 
    else { 
     completion(false) 
    } 

} 
+0

अच्छा लगता है, मैं यहां कुछ गार्ड विवरणों का उपयोग करने की सलाह दूंगा। आम तौर पर कुछ ऐसा होता है जब मेरे पास बहुत सारे इल्स-इल्स होते हैं (इस तरह से दृश्यमान, अनचाहे वार्स इमो के साथ खेलने में मदद करता है)। – murphguy

+0

@murphguy हाँ मेरे पास बहुत सी चीजें हैं जिन पर मुझे बेहतर होने की आवश्यकता है ... गार्ड उनमें से एक है – RubberDucky4444

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