关键词:
【中文标题】Firestore iOS - 为啥我的阵列多次打印出来?【英文标题】:Firestore iOS - Why does my array get printed out multiple times?Firestore iOS - 为什么我的阵列多次打印出来? 【发布时间】:2020-06-28 09:08:10 【问题描述】:我成功地能够在表格视图中显示用户朋友数组,但是当我打印出数组时,它被打印了 3 次而不是 1 次,我该如何解决这个问题?
好友系统模型:
var removeFriendListener: ListenerRegistration!
func addFriendObserver(_ update: @escaping () -> Void)
removeFriendListener = CURRENT_USER_FRIENDS_REF.addSnapshotListener snapshot, error in
self.friendList.removeAll()
guard error == nil else
#if DEBUG
print("Error retreiving collection")
#endif
return
for document in snapshot!.documents
let id = document.documentID
self.getUser(id, completion: (user) in
self.friendList.append(user)
update()
)
if snapshot!.documents.count == 0
update()
func removeFriendObserver()
removeFriendListener.remove()
好友系统视图控制器:
override func viewWillAppear(_ animated: Bool)
super.viewWillAppear(animated)
FriendSystem.system.addFriendObserver () in
DispatchQueue.main.async
self.tableView.reloadData()
print(FriendSystem.system.friendList)
数组打印出来
[App.User]
[App.User, App.User]
[App.User, App.User, App.User]
【问题讨论】:
因为您在循环的每次迭代中都调用了闭包。仅在循环之后调用它。 @JoakimDanielson 的代码是什么样子的 仅将if snapshot!.documents.count == 0 update()
替换为 update()
我不知道,也许你做错了。
因为有3个朋友所以打印了3次? for document in snapshot!.documents
。此外,您还拥有 DispatchQueue,因为在 Firebase 闭包中进行的任何调用都是在主线程上完成的,因此您确实不需要它。为简单起见,可以删除许多无关代码 - 根据代码,您根本不需要完成处理程序。我们也不知道这个self.getUser
做了什么,所以它也可能是一个问题。
【参考方案1】:
你不应该在这里调用你的 update():-
for document in snapshot!.documents
let id = document.documentID
self.getUser(id, completion: (user) in
self.friendList.append(user)
update()
)
您应该在 for 循环完成后调用它。
【讨论】:
新的“呼叫”会去哪里? @C.Agu 如 cmets 中所建议,您可以在 for 循环结束后调用update()
,不需要 if snapshot!.documents.count == 0 update()
嗨@AppDev,当我这样做时,我得到一个空数组,为什么会这样?
因为它可能会在 for 循环完成之前被调用尝试在 update() 处设置断点并检查为啥我的 Firebase 存储 URL 没有上传到 Google Cloud Firestore?
】为啥我的Firebase存储URL没有上传到GoogleCloudFirestore?【英文标题】:Whyaren\'tmyFirebaseStorageURLsuploadingtoGoogleCloudFirestore?为什么我的Firebase存储URL没有上传到GoogleCloudFirestore?【发布时间】:2019-12-2913:20:33【问题描述】:我正在尝试... 查看详情
为啥 Firestore 舍入 64 位整数?
】为啥Firestore舍入64位整数?【英文标题】:WhyisFirestorerounding64bitintegers?为什么Firestore舍入64位整数?【发布时间】:2019-12-1607:00:58【问题描述】:我正在尝试将来自python程序的64位整数存储在我的Firestore数据库中。问题是最后一... 查看详情
为啥我不能将从 Firestore 获取的值分配给 Swift 中的数组?
】为啥我不能将从Firestore获取的值分配给Swift中的数组?【英文标题】:WhyIcouldn\'tassignfetchedvaluesfromFirestoretoanarrayinSwift?为什么我不能将从Firestore获取的值分配给Swift中的数组?【发布时间】:2018-09-0913:19:08【问题描述】:我多次... 查看详情
为啥 Cloud Firestore 更新这么多? [复制]
】为啥CloudFirestore更新这么多?[复制]【英文标题】:WhyCloudFirestoreupdatessomuch?[duplicate]为什么CloudFirestore更新这么多?[复制]【发布时间】:2020-12-0916:08:41【问题描述】:我正在开发一个物流仓库项目。我的想法是,我使用CloudFires... 查看详情
为啥我的 firebase onAuthStateChanged() 触发多次? (反应原生)
】为啥我的firebaseonAuthStateChanged()触发多次?(反应原生)【英文标题】:WhydoesmyfirebaseonAuthStateChanged()triggermultipletimes?(ReactNative)为什么我的firebaseonAuthStateChanged()触发多次?(反应原生)【发布时间】:2018-09-2703:10:45【问题描述... 查看详情
为啥我的消息显示多次?
】为啥我的消息显示多次?【英文标题】:Whymymessagesarebeingdisplayedmanytimes?为什么我的消息显示多次?【发布时间】:2021-06-3009:23:20【问题描述】:我使用电子创建了一个聊天室。但是,当我向服务器发送消息并从那里发送消息... 查看详情
为啥我的按钮点击执行多次?
】为啥我的按钮点击执行多次?【英文标题】:Whydoesmybuttonclickexecutemultipletimes?为什么我的按钮点击执行多次?【发布时间】:2018-01-0506:14:25【问题描述】:我已经编写了这个ajax代码来将数据发送到Web服务asmx。它可以工作,但... 查看详情
为啥我的 PhoneGap 定位函数多次返回位置?
】为啥我的PhoneGap定位函数多次返回位置?【英文标题】:WhydoesmyPhoneGaplocationfunctionreturnthepositionmultipletimes?为什么我的PhoneGap定位函数多次返回位置?【发布时间】:2017-09-2019:38:05【问题描述】:我有这个功能应该可以得到更准... 查看详情
为啥 iOS 蓝牙会多次发现同一设备?
】为啥iOS蓝牙会多次发现同一设备?【英文标题】:WhydoesiOSbluetoothdiscoverthesamedevicemorethanonce?为什么iOS蓝牙会多次发现同一设备?【发布时间】:2015-01-1320:37:01【问题描述】:我正在尝试使用以下语句发现心率监测器:[self.central... 查看详情
为啥我的 NSURLSession dataTask 多次调用服务器?
】为啥我的NSURLSessiondataTask多次调用服务器?【英文标题】:WhydoesmyNSURLSessiondataTaskmakemultiplecallstotheserver?为什么我的NSURLSessiondataTask多次调用服务器?【发布时间】:2014-06-2715:02:36【问题描述】:我有一个使用以下方法创建的NSUR... 查看详情
为啥我的 8M L3 缓存对大于 1M 的阵列没有任何好处?
】为啥我的8ML3缓存对大于1M的阵列没有任何好处?【英文标题】:Whydoesmy8ML3cachenotprovideanybenefitforarrayslargerthan1M?为什么我的8ML3缓存对大于1M的阵列没有任何好处?【发布时间】:2015-07-3013:42:48【问题描述】:我受到这个问题的启... 查看详情
为啥不需要的数据被推送到我的阵列中?
】为啥不需要的数据被推送到我的阵列中?【英文标题】:Whyunwanteddataispushedinmyarray?为什么不需要的数据被推送到我的阵列中?【发布时间】:2014-07-1313:46:39【问题描述】:我想创建一个表单字段,其中可以使用“添加”按钮插... 查看详情
为啥我的 Streamlit 应用程序会多次打开?
】为啥我的Streamlit应用程序会多次打开?【英文标题】:WhydoesmyStreamlitapplicationopenmultipletimes?为什么我的Streamlit应用程序会多次打开?【发布时间】:2020-03-0607:51:52【问题描述】:我正在尝试使用启动Streamlit应用程序importosos.popen... 查看详情
为啥即使不是公开的,我也能读、写firestore?
】为啥即使不是公开的,我也能读、写firestore?【英文标题】:Whyiamabletoread,writefirestoreevenwhenitisnotpublic?为什么即使不是公开的,我也能读、写firestore?【发布时间】:2021-02-0120:51:57【问题描述】:我从AndroidStudio测试我的应用。... 查看详情
ios - Firestore 仍会覆盖我的数据?
】ios-Firestore仍会覆盖我的数据?【英文标题】:ios-Firestorestilloverwritesmydata?【发布时间】:2018-01-0805:37:46【问题描述】:我正在尝试将数据添加到我的firestore中,但是,我已使用SetOptions.merge()方法遵循文档,但它仍在覆盖我的数... 查看详情
为啥我的信号处理程序(引发异常)不会多次触发?
】为啥我的信号处理程序(引发异常)不会多次触发?【英文标题】:Whydoesn\'tmysignalhandler(whichthrowsanexception)triggermorethanonce?为什么我的信号处理程序(引发异常)不会多次触发?【发布时间】:2011-05-0218:38:50【问题描述】:我... 查看详情
为啥我的阵列没有消耗我发送给它的信息?斯威夫特 4
】为啥我的阵列没有消耗我发送给它的信息?斯威夫特4【英文标题】:WhyismyarraynotconsumingtheinformationIsendtoit?Swift4为什么我的阵列没有消耗我发送给它的信息?斯威夫特4【发布时间】:2017-11-0918:05:08【问题描述】:嗨,我对这个s... 查看详情
为啥添加单个文档时,Firestore 侦听器会返回 .add 两次?
】为啥添加单个文档时,Firestore侦听器会返回.add两次?【英文标题】:Whyisafirestorelistenerreturning.addedtwicewhenasingledocumentisadded?为什么添加单个文档时,Firestore侦听器会返回.add两次?【发布时间】:2017-12-1201:22:27【问题描述】:我... 查看详情