Swift iOS - 循环 运行 可以比 Date().timeIntervalSince1970 生成的 Date Sec 更快

Swift iOS -Can a Loop Run Faster then Date Secs generated by Date().timeIntervalSince1970

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

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

image0__1507792099
image1__1507793000
image2__1507793001
image3__1507793001
image4__1507793002
image5__1507793002

image2 和 image3 可以打印相同的时间戳吗?image4 和 image5 可以打印同样的事情吗?

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 时,您一眼就知道您正在创建一个唯一标识符。

Apple的UUID使用RFC 4122 version 4 which has 5.3x10^36 possible values, leaving the chances of collisons为无穷小

您可以替换此行:

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

有了这个:

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