Swift iOS-循环能否比Date()生成的日期秒运行得更快。TimeIntervalnce1970

Swift iOS-循环能否比Date()生成的日期秒运行得更快。TimeIntervalnce1970,ios,swift,function,loops,nsdate,Ios,Swift,Function,Loops,Nsdate,我从Firebase中提取一些数据,将数据添加到一个循环中,然后在每个循环运行时打印秒数。循环是否有可能运行得如此之快,以至于它会将相同的秒打印两次 例如,在下面的代码中,这种结果是否可能 image0__1507792099 image1__1507793000 image2__1507793001 image3__1507793001 image4__1507793002 image5__1507793002 image2和image3是否都可以使用相同的时间戳打印,image4和imag

我从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使用的是which has,这使得使用它的机会微乎其微

您可以替换此行:

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

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

为什么不直接使用一个而不是时间戳或
arc4Random
让uuid=uuid().uuidString
@ColGraff感谢您的回复!注意我在帖子底部写的是arc4Random。我知道我也可以使用uuid。我真的想知道这种情况是否可能?我不会用时间来唯一地标识循环中的任何数据,除非我确定循环比我的时间戳的粒度慢几个数量级。如果真的发生了,那就不值得了。UUID
UUID
更安全,至少同样易于使用。它也正是针对这个用例而设计的,而不是通过
arc4Random
@ColGraff嘿,谢谢,你回答了这个问题。用这么多的话来说,复制时间戳是可能的。这正是我需要知道的。你介意把它作为正式答复吗?这样我就可以接受它作为正式答复了?我相信其他开发人员也考虑过这种情况,“循环是否可以比Date()生成的Date Secs运行得更快。timeIntervalSince1970”。是的,特别是如果您四舍五入到整数,就像上面的代码一样。但其他人建议,无论如何,使用时间戳作为唯一标识符是不谨慎的。使用
UUID
或一些同步递增值。