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")
我从 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")