现在它是这样完成的:从Firebase 实时数据库 (FDB)读取数据并将其写入CoreData(CD)。有一个强制更新按钮(我完全清除了CD并通过FDB覆盖了数据observeSingleEvent)
加载清除数据并将数据写入CoreData的函数:
func loadCDDAta(completionHandler: @escaping CompletionHandler) {
ref = FIRDatabase.database().reference()
NetworkCheckingClass.isConnectedToNetwork(){
isConnected in
if isConnected == true {
if Reachability.sharedInstance.isConnectedToNetwork() == true {
self.ref.observeSingleEvent(of: .value, with: { (snapshot: FIRDataSnapshot) in
let value = snapshot.value as? NSDictionary
if snapshot.value != nil {
self.deleteRecords()
if let f = value?["Place"] as? [String:AnyObject] {
CoreDataManager.instance.saveCDDict(f)
} else if let f = value?["Place"] as? [AnyObject] {
CoreDataManager.instance.saveCDArray(f)
}
completionHandler(true)
} else {
completionHandler(false)
}
}) { (error) in
completionHandler(false)
print(error.localizedDescription)
}
} else {
completionHandler(false)
print("NO Connect")
}
print("Connect OK")
} else {
completionHandler(false)
print("NO Connect")
}
}
}
func deleteRecords() -> Void {
let moc = CoreDataManager.instance.managedObjectContext
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "DictPlace")
let result = try? moc.fetch(fetchRequest)
let resultData = result as! [DictPlace]
for object in resultData {
moc.delete(object)
}
do {
try moc.save()
print("saved!")
} catch let error as NSError {
print("Could not save \(error), \(error.userInfo)")
} catch {
}
}
也就是说,如果来自Firebase的 Json重量为 20Mb,那么它会提取所有 20Mb。
有必要:通过按下按钮,观察FDB中的数据变化,如果发生变化,则仅将已更改或新的数据添加到CD (不删除其他所有内容)。如果什么都没有改变——那就不要碰任何东西。
仅包含来自Firebase的更新数据的 Json最大重量为 100-200Kb + 更少的加载时间。
例如,您还可以根据数据将哈希值存储在 firebase 中。也就是说,创建一个单独的分支并在那里只写入唯一的哈希值。拉取它们会更快,然后检查哈希是否在本地数据库中是当前的,然后拉取或不拉取哈希负责的数据。