在两个不同的构建中从一个数组中检索项目会返回不一致的结果

Posted

技术标签:

【中文标题】在两个不同的构建中从一个数组中检索项目会返回不一致的结果【英文标题】:Retrieving items from one array in two different builds returns non-consistent results 【发布时间】:2018-10-21 17:22:26 【问题描述】:

swift 4.1,Xcode 10

我正在从 Google Firestore 获取文档并从中创建相应的对象。这些对象稍后被放入一个数组中。提供数组的代码如下所示:

for document in querySnapshot!.documents 
    // Data is fetched and "parsed" here.
   if let coords = document.get("Geopoint"), let prijmajKarty = document.get("Card"), let name = document.get("Name"), let monOn = document.get("mondayOn"), let tueOn = document.get("tuesdayOn"), let wedOn = document.get("wednesdayOn"), let thuOn = document.get("thursdayOn"), let friOn = document.get("fridayOn"), let satOn = document.get("saturdayOn"), let sunOn = document.get("sundayOn"), let monOff = document.get("mondayOff"), let tueOff = document.get("tuesdayOff"), let wedOff = document.get("wednesdayOff"), let thuOff = document.get("thursdayOff"), let friOff = document.get("fridayOff"), let satOff = document.get("saturdayOff"), let sunOff = document.get("sundayOff")  
    // Instances of VecerkaAnnotation are created here and added in an array for further use.
    let point = coords as! GeoPoint
    let lat = point.latitude
    let lon = point.longitude
    let coord = CLLocationCoordinate2D(latitude: lat, longitude: lon)
    let newVecerka = VecerkaAnnotation(myCoordinate: coord)
    newVecerka.name = name as! String
    newVecerka.prijmajiKarty = prijmajKarty as! Bool
    newVecerka.monOn = monOn as! Int
    newVecerka.monOff = monOff as! Int
    newVecerka.tueOn = tueOn as! Int
    newVecerka.tueOff = tueOff as! Int
    newVecerka.wedOn = wedOn as! Int
    newVecerka.wedOff = wedOff as! Int
    newVecerka.thuOn = thuOn as! Int
    newVecerka.thuOff = thuOff as! Int
    newVecerka.friOn = friOn as! Int
    newVecerka.friOff = friOff as! Int
    newVecerka.satOn = satOn as! Int
    newVecerka.satOff = satOff as! Int
    newVecerka.sunOn = sunOn as! Int
    newVecerka.sunOff = sunOff as! Int
    self.customAnnotationsArray.append(newVecerka)

我在将整个数组放在一起后打印整个数组,然后逐个打印每个项目以比较数组的内容与被点击的对象,结果如下:

[<Vecerka.VecerkaAnnotation: 0x600005c12ee0>, 
<Vecerka.VecerkaAnnotation: 0x600005c1b480>, 
<Vecerka.VecerkaAnnotation: 0x600005cee620>, 
<Vecerka.VecerkaAnnotation: 0x600005c1bb60>]

印刷品:

<Vecerka.VecerkaAnnotation: 0x600005c12ee0>
<Vecerka.VecerkaAnnotation: 0x600005c1b480>
<Vecerka.VecerkaAnnotation: 0x600005cee620>
<Vecerka.VecerkaAnnotation: 0x600005ceec60>

你可以看到最后打印的项目没有对应数组中的任何ID。

几秒钟后,我再次构建了应用程序,没有对代码进行任何更改:

[<Vecerka.VecerkaAnnotation: 0x600000e61a40>, 
<Vecerka.VecerkaAnnotation: 0x600000e601e0>, 
<Vecerka.VecerkaAnnotation: 0x600000e60be0>, 
<Vecerka.VecerkaAnnotation: 0x600000e61cc0>]

<Vecerka.VecerkaAnnotation: 0x600000e61a40>
<Vecerka.VecerkaAnnotation: 0x600000e601e0>
<Vecerka.VecerkaAnnotation: 0x600000e60be0>
<Vecerka.VecerkaAnnotation: 0x600000e61cc0>

您可以看到在第二次构建时一切正常。

我在许多不同的版本上测试过这个,尝试在模拟器和真机上运行,​​结果是一样的。

这可能是应用与 Firestore 之间的通信问题吗?

如果有人可以帮助我,我将不胜感激,我不知道幕后发生了什么,所以如果有人能对此有所了解,那将是完美的。

谢谢一百万! :))

【问题讨论】:

始终将代码、数据、日志、错误消息等作为文本(而非图像)发布,以便它们可以搜索,并且可以在回答时复制。请edit您的问题 - 并添加您正在使用的代码 @AshleyMills 好点,将图像更改为代码。 这个 ID 与你的对象中的数据无关,它只是指向 RAM 中对象的指针 @DimaRostopira 数组中的对象用于我的mapView 中的注释,但是当指针对应于数组中的对象时,一切正常,但在下一次构建时它们没有' t,不匹配的对象的注释根本不显示在地图上,这就是我需要解决这个问题的原因 【参考方案1】:

所以问题显然出在其他地方。

在注释数组实际完成填充之前,我正在调用创建地图注释的方法。因为我忘了异步思考。

问题在于 firebase 调用是异步的,因此数组必须有一个属性观察者,并在数组发生更改时相应地更新 mapView(创建注释)。

【讨论】:

以上是关于在两个不同的构建中从一个数组中检索项目会返回不一致的结果的主要内容,如果未能解决你的问题,请参考以下文章

我可以像在 for 循环中从数组中索引项目一样从元组中检索项目吗?

在 Swift 中从 JSON 对象解析多个数组

在swift 4.2中从数组返回组[重复]

如何从flutter中从异步任务中检索到的数据中将图像加载到卡片中?

在一个云功能中从 firebase 数据库中检索多个数据

如何在 C# 代码中从本地存储中检索值?