Swift iOS - 循环运行速度更快,然后是Date()。timeIntervalSince1970生成的Date Sec

时间:2017-07-03 02:18:43

标签: ios swift function loops nsdate

我从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。

1 个答案:

答案 0 :(得分:1)

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

UUID是一系列值,通过算法或随机方式设计为尽可能独特。它们比通过arc4Random生成的时间戳或值更安全,并且它们还具有在代码中自我记录的额外好处。当您看到UUID struct一眼就知道您正在创建唯一标识符时。

Apple的UUID使用RFC 4122 version 4 5.3x10^36 possible valuescollisons的可能性为无穷小。

您可以替换此行:

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

用这个:

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