2017-07-03 47 views
0

我从Firebase中提取一些数据,将数据添加到循环中,然后在每个循环运行时打印秒数。有没有机会循环运行速度如此之快以至于它会打印两次相同的秒数?Swift iOS - 循环运行更快,然后由Date()生成Date Secs timeIntervalSince1970

例如,在下面的代码中是可能的结果?

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) 
    } 

FYI我问这个问题的原因是因为我使用的是secs作为扩展到火力地堡数据添加到DocumentsDirectory。一切工作正常,但我不确定是否可能存在时间上的重叠,这意味着如果某些数据都具有相同的时间戳,那么将拉取和保存的一些数据将被覆盖。我正在琢磨使用arc4Random来代替。

+0

为什么不直接使用['UUID'](https://developer.apple.com/documentation/foundation/uuid)而不是时间戳或arc4Random:'let uuid = UUID()。uuidString' – ColGraff

+0

@ColGraff感谢您的回复!在我发表的帖子的底部注意到了arc4Random。我知道我也可以使用uuid。我真的很想知道这种情况可能吗? –

+1

我不会使用时间来唯一标识循环中的任何数据,除非我确定该循环比我的时间戳的粒度慢了几个数量级。如果发生这种情况,那就不值得。 'UUID'更安全,至少易于使用。它也被设计为这个用例,而不是通过'arc4Random'的一个简单的随机数。 – ColGraff

回答

1

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

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

Apple的UUID使用RFC 4122 version 4它有5.3x10^36 possible values,使collisons的机会是无限小的。

您可以替换该行:

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

与此:

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

谢谢先生! –