【问题标题】:append to array causing crash附加到数组导致崩溃
【发布时间】:2019-01-01 23:26:56
【问题描述】:

我有以下这段代码的崩溃报告。我不确定为什么这是错误的。

崩溃:

Crashed: com.apple.root.background-qos
0  libswiftCore.dylib                 0x1082ebf94 specialized _fatalErrorMessage(_:_:file:line:flags:) + 106516
1  libswiftCore.dylib                 0x10818c214 default argument 0 of _preconditionFailure(_:file:line:) + 109688
2  libswiftSwiftOnoneSupport.dylib    0x108804d60 specialized _ArrayBufferProtocol._arrayOutOfPlaceUpdate<A>(_:_:_:_:) + 55124
3  libswiftSwiftOnoneSupport.dylib    0x1087f9178 specialized Array._copyToNewBuffer(oldCount:) + 7020
4  libswiftSwiftOnoneSupport.dylib    0x1087f51bc specialized Array.append(_:) + 17480   

代码:

self.missingEmployees.removeAll()
for eid in eids {
    let indexFound = self.employees.index(where: {$0.employeeId == eid})
    if indexFound == nil {
        self.missingEmployees.append(eid)
    }
}

守卫让 for 循环中的方法可以解决这个问题吗?

【问题讨论】:

  • 是什么让你不敢尝试?
  • @Desdenova 什么都没有,但我无法重现崩溃,所以我想看看是否有人知道为什么上面会崩溃,因为我看不出它有什么问题,可能会让守卫只是导致同样的问题

标签: ios arrays swift append crashlytics


【解决方案1】:

我自己刚刚收到此错误。对我来说,这是由不同线程修改数组引起的。数组不是线程安全的。

我使用 GCD 解决了这个问题,并将附加操作放在同步块中。在另一个地方我使用 NSCache 解决了它,因为 NSCache 已经是线程安全的。

【讨论】:

  • 完全同意你的看法。
  • @haagneti 我遇到了同样的崩溃,虽然崩溃了,但我使用了串行队列。 ``let serialQueue = DispatchQueue(label: "SerialQueue") //多个线程同时修改数组so putin queue serialQueue.sync { self.result.append(ContactModel(contactName: personName, mobileNo: arrPhoneNumber, contactType: arrContactType, profileImage :userProfileImage,digitPhoneNumber:arrPhoneNumberWithOnlyNumber,countryRegionCode:arrTerritoryCode,contactUniqueIdentifier:personIdentifier))}```
【解决方案2】:

如果您想在 swift 中找到数组之间的差异,有几种方法可以做到这一点。

https://developer.apple.com/documentation/swift/set

您可以使用subtract 或通过formSymmetricDifference 创建一个新集。

【讨论】:

  • Kruhowski 我只需要根据特定条件追加到数组
  • 仍然是使用 Set Algebra 并在您的自定义对象上执行适当的比较方法的最佳方法 - 我假设是 Employee。至少在我看来
  • 你能理解为什么索引实际上会导致崩溃吗?您如何修改小的 for 循环以使用您的建议?
猜你喜欢
  • 1970-01-01
  • 2012-05-03
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
相关资源
最近更新 更多