ios - 如何避免firestore中的dup文件?
问题描述
我正在尝试检查 FB 事件是否已作为文档存在于我的 Firestore 集合中,如果没有将新的 FB 事件写入新文档。我的问题是,将解析的图形请求“结果”字典与我的集合中的 fbEventIds 进行比较时,逻辑设置不正确并创建重复而不是避免它们。
逻辑上我的功能是如何设置的:
func getFbEvents {
fbgraphrequest {
parse graphrequest results into an Event object {
get Firestore snapshot of 'events' collection {
//Compare graph request event id to event ids stored in firestore
if graphrequesteventId == FirestoresnapshoteventsFbId {
return
}
else {
setdata of new fb event in firestore events collection
}}}}}
实际代码
我尝试在解析字典之后和基于其他 SO 线程检索快照之前添加 DispatchGroup 和 DispatchQueue 输入和离开命令,但它仍然不适用于我的代码。
static func getFBEvents() {
let graphRequest : GraphRequest = GraphRequest(graphPath: "/me", parameters: ["fields":"id, events"], httpMethod: .get)
graphRequest.start(completionHandler: { (connection, result, error) -> Void in
if error != nil {
}
else {
if let dictionary = result as? [String: Any] {
if let dictionary1 = dictionary["events"] as? [String: Any]{
if let dataList = dictionary1["data"] as? [[String: Any]] {
dataList.forEach { dictionary in
let eventDescription = dictionary["description"] as? String
let fbEventId = dictionary["id"] as? String
let eventName = dictionary["name"] as? String
let eventStart = dictionary["start_time"] as? String
if let nestedDictionary = dictionary["place"] as? [String: Any] {
let eventLocation = nestedDictionary["name"] as? String
//Get a Firebase reference
let db = Firestore.firestore()
db.collection("events").getDocuments() { (querySnapshot, err) in
if let err = err {
return
}
else {
for doc in querySnapshot!.documents {
let e = Event(snapshot: doc)
print("fb eventId: \(e?.fbEventId) & \(fbEventId)")
if e!.fbEventId != fbEventId {
print("event does not already exists, writing event to Firestore")
let newDocument = Firestore.firestore().collection("events").document()
//Create a dictionary for the event
let eventData = ["eventDescription":eventDescription, "eventStart":eventStart,"fbEventId": fbEventId, "eventCreated": Timestamp(date: Date()), "eventId": newDocument.documentID, "eventName": eventName, "eventSource": "FB", "eventLocation": eventLocation] as [String : Any]
//Create the profile for the event
newDocument.setData(eventData) { (error) in
if error != nil {
}
else {
}
}//close Firestore setData
}
else {
return
}
}
}
}//close retrieve events
}//close nested Dictionfary for place
}//close datalist for each
}//close datalist
}//close dictionary1
}//close dictionary
}//close else
}//close graph request start
)}//close getFBEvents
}
解决方案
经过更多的挖掘,我想我得到了我需要的东西。如果您认为这不能提供预期的结果,但经过一些测试后它可以工作,请发表评论。
基本上我计算了来自 Firestore 获取查询的快照中的结果,以查看该 fbEventId 是否已经存在,如果不是,我编写了新的 FB 事件,如果它已经存在,我返回。
static func getFBEvents() {
let graphRequest : GraphRequest = GraphRequest(graphPath: "/me", parameters: ["fields":"id, events"], httpMethod: .get)
graphRequest.start(completionHandler: { (connection, result, error) -> Void in
if error != nil {
print("Error took place: \(String(describing: error))")
}
else {
print("Print entire fetched result for events: \(String(describing: result))")
if let dictionary = result as? [String: Any] {
if let dictionary1 = dictionary["events"] as? [String: Any]{
if let dataList = dictionary1["data"] as? [[String: Any]] {
dataList.forEach { dictionary in
let eventDescription = dictionary["description"] as? String
let fbEventId = dictionary["id"] as? String
let eventName = dictionary["name"] as? String
let eventStart = dictionary["start_time"] as? String
if let nestedDictionary = dictionary["place"] as? [String: Any] {
let eventLocation = nestedDictionary["name"] as? String
//Get a Firebase reference
let db = Firestore.firestore()
db.collection("events").whereField("fbEventId", isEqualTo: fbEventId!).getDocuments() { (querySnapshot, err) in
let size = querySnapshot?.count
if let err = err {
print("Error \(err)")
return
}
//If size of snapshot is equal to 0, FB event doesn't exist in user event collection so write fb event
else {
if size! == 0 {
print("event does not already exists, writing event to Firestore")
let newDocument = Firestore.firestore().collection("events").document()
//Create a dictionary for the event
let eventData = ["eventDescription":eventDescription, "eventStart":eventStart,"fbEventId": fbEventId, "eventCreated": Timestamp(date: Date()), "eventId": newDocument.documentID, "eventName": eventName, "eventSource": "FB", "eventLocation": eventLocation] as [String : Any]
//Create the profile for the event
newDocument.setData(eventData) { (error) in
if error != nil {
print("There was an error")
}
else {
}
}//close Firestore setData
}
else {
print("event already exists")
//Get a Firebase reference
return
}
}}}}}}}}})}}
推荐阅读
- javascript - NetSuite SuiteScript 2.0:内联 HTML document.querySelector() 结果
- dns - Route 53 子域 www 未定向到站点
- python-3.x - 如何执行并行 psycopg2 copy_from?
- java - SecurityException - “调用者......不是范围委托阻止卸载的代表”(Android 8 - Java)
- wordpress - 在 WooCommerce 产品元变体产品中显示尺寸
- kotlin - 使用时间管理库构建 kotlin 多平台(js、jvm)
- python - 如何部署海量数据的 Dash App
- html - 如何在表格内添加全屏图像
- django - 在 Django 中创建 ForeignKey 约束的困难
- python - ImportError win32api