我从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。
答案 0 :(得分: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")