Swift iOS - 循环运行速度比 Date().timeIntervalSince1970 生成的日期秒更快



我从Firebase中提取一些数据,将数据添加到循环中,然后在运行每个循环时打印秒数。循环是否有可能运行得如此之快,以至于它会打印相同的秒两次?

例如,在下面的代码中,这种结果可能吗?

image0__1507792099
image1__1507793000
image2__1507793001
image3__1507793001
image4__1507793002
image5__1507793002

图像 2 和图像3 是否可以使用相同的时间戳打印,图像 4 和图像 5 也会发生同样的事情吗?

var images:[String] = []
let secs = Int(Date().timeIntervalSince1970)
myRef?.observeSingleEvent(of: .value, with: { 
(snapshot) in
if let dict = snapshot.value as? [String:Any]{
let image0 = dict["image0"] as? String
let image1 = dict["image1"] as? String
let image2 = dict["image2"] as? String
let image3 = dict["image3"] as? String
let image4 = dict["image4"] as? String
let image5 = dict["image5"] as? String
self.images.append(image0)
self.images.append(image1)
self.images.append(image2)
self.images.append(image3)
self.images.append(image4)
self.images.append(image5)
for image in self.images{
print("(image)__(self.secs)")
let x = someConversionMethodThatReturnsAnImage(str: image)
saveData(image: x)
}
}
}
fileprivate func saveData(image: UIImage){
let imageExt = String(describing: secs).appending(".jpg")
let fileManager = FileManager.default
let documentsPath = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first! as NSURL
let imagePath = documentsPath.appendingPathComponent(imageExt)?.path
let data = UIImageJPEGRepresentation(image, 0.8)
fileManager.createFile(atPath: imagePath!, contents: data, attributes: nil)
}

仅供参考,我问这个问题的原因是因为我将secs用作将Firebase数据添加到DocumentsDirectory的扩展。一切正常,但我不确定时间是否会重叠,这意味着如果它们都具有相同的时间戳,则提取和保存的一些数据将被覆盖。我正在考虑使用 arc4Random 代替。

虽然你当然可以使用时间戳来使文件名唯一,但我不会这样做。即使它现在有效,情况也可能发生变化,使循环运行得更快,并导致您丢失数据,因为您在同一量子期间创建了两个文件。还有一些因素,例如由于夏令时或其他调整而导致时钟更改。我会通过使用一种更安全的方法完全避免这个机会:使用 UUID。

UUID 是一系列值,这些值旨在通过算法或随机方式尽可能唯一。它们比时间戳或通过arc4Random生成的值安全得多,并且它们还具有在代码中自我记录的额外好处。当您看到UUID struct时,您会一目了然地知道您正在创建唯一标识符。

苹果的UUID使用RFC 4122版本4,该版本具有5.3x10^36个可能的值,因此碰撞的可能性非常小。

您可以替换此行:

let imageExt = String(describing: secs).appending(".jpg")

有了这个:

let imageExt = UUID().uuidString.appending(".jpg")

相关内容

  • 没有找到相关文章

最新更新