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

struct MRecords: Hashable, Decodable {
var text: String
var date: Date
var id: String

init(text: String, date: Date, id: String) {
    self.text = text
    self.date = date
    self.id = id
}

init?(document: DocumentSnapshot) {
    guard let data = document.data() else { return nil}
    guard let text = data["text"] as? String,
    let date = data["date"] as? Date,
    let id = data["id"] as? String
    
    else { return nil }
    
    self.text = text
    self.date = date
    self.id = id
}

init?(document: QueryDocumentSnapshot) {
    let data = document.data()
    guard let text = data["text"] as? String,
    let date = data["date"] as? Date,
    let id = data["id"] as? String
    
    else { return nil }
    
    self.text = text
    self.date = date
    self.id = id
}

func hash(into hasher: inout Hasher) {
    hasher.combine(id)
}

static func == (lhs: MRecords, rhs: MRecords) -> Bool {
    return lhs.id == rhs.id
}

func contains(filter: String?) -> Bool {
    guard let filter = filter else { return true }
    if filter.isEmpty { return true }
    let lowercasedFilter = filter.lowercased()
    return text.lowercased().contains(lowercasedFilter)
}

}

और मैं डेटा लाने के लिए श्रोता का उपयोग कर रहा हूँ:

 func recordsObserve(records: [MRecords], completion: @escaping (Result<[MRecords], Error>) -> Void) -> ListenerRegistration? {
        var records = records
        let recordsRef = db.collection(["users", currentUserId, "records"].joined(separator: "/"))
        let recordsListener = recordsRef.addSnapshotListener { (querySnapshot, error) in
            guard let snapshot = querySnapshot else {
                print(1)
                completion(.failure(error!))
                return
            }
            
            snapshot.documentChanges.forEach { (diff) in
                guard let record = MRecords(document: diff.document) else { return }
                switch diff.type {
                case .added:
                    guard !records.contains(record) else { return }
                    records.append(record)
                case .modified:
                    guard let index = records.firstIndex(of: record) else { return }
                    records[index] = record
                case .removed:
                    guard let index = records.firstIndex(of: record) else { return }
                    records.remove(at: index)
                }
            }
            
            completion(.success(records))
        }
        
        return recordsListener
    }

मेरे व्यू कंट्रोलर में मैं डेटा को सरणी में प्राप्त करने के लिए अगले कोड का उपयोग कर रहा हूं:

waitingRecordsListener = ListenerService.shared.recordsObserve(records: records, completion: { (result) in
    switch result {
    case .success(let records):
        self.records = records
        self.tableView.reloadData()
    case .failure(let error):
        print(1)
    }
})

}

लेकिन यह काम नहीं करता! अगर मैं अपने मॉडल दिनांक संपत्ति प्रकार को दिनांक से स्ट्रिंग में बदलता हूं, तो यह काम करना शुरू कर देता है। मैं इसे केवल स्ट्रिंग ही नहीं, दिनांक प्रकार के साथ कैसे काम कर सकता हूं?

0
Parcker 12 मई 2021, 12:27

1 उत्तर

सबसे बढ़िया उत्तर

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

2
esen 12 मई 2021, 12:45
क्या आप कुछ कोड उदाहरण लिख सकते हैं कि मैं टाइमस्टैम्प का उपयोग करने के लिए अपना मॉडल कैसे बदल सकता हूं?
 – 
Parcker
14 मई 2021, 16:36
1
फायरस्टोर आरंभ करने की मार्गदर्शिका में टाइमस्टैम्प का उपयोग करने का तरीका दिखाने वाला कुछ कोड है - देखें डेटा प्रकार। SO Timestamp पर कई उदाहरण यहां भी हैं।
 – 
Jay
14 मई 2021, 20:37