Nỗ lực tính toán của bạn elapsedTime
không chính xác. Trong Swift 3, nó sẽ là:
let elapsed = Date().timeIntervalSince(timeAtPress)
Lưu ý ()
sau khi Date
tham khảo. Khởi Date()
tạo đối tượng ngày tháng mới, rồi timeIntervalSince
trả về chênh lệch thời gian giữa đối tượng đó và timeAtPress
. Điều đó sẽ trả về một giá trị dấu phẩy động (về mặt kỹ thuật, a TimeInterval
).
Nếu bạn muốn Int
giá trị đó được cắt ngắn thành một giá trị, bạn chỉ có thể sử dụng:
let duration = Int(elapsed)
Và, BTW, định nghĩa của bạn về timeAtPress
biến không cần phải khởi tạo một Date
đối tượng. Tôi cho rằng bạn dự định:
var timeAtPress: Date!
Điều đó định nghĩa biến là một Date
biến ( một biến không được bao bọc hoàn toàn), nhưng có lẽ bạn sẽ trì hoãn việc khởi tạo thực tế của biến đó cho đến khi pressed
được gọi.
Ngoài ra, tôi thường sử dụng CFAbsoluteTimeGetCurrent()
, ví dụ:
var start: CFAbsoluteTime!
Và khi tôi muốn thiết lập startTime
, tôi làm như sau:
start = CFAbsoluteTimeGetCurrent()
Và khi tôi muốn tính số giây đã trôi qua, tôi làm như sau:
let elapsed = CFAbsoluteTimeGetCurrent() - start
Cần lưu ý rằng CFAbsoluteTimeGetCurrent
tài liệu cảnh báo chúng tôi:
Các cuộc gọi lặp đi lặp lại đến hàm này không đảm bảo kết quả tăng đơn điệu. Thời gian hệ thống có thể giảm do đồng bộ hóa với tham chiếu thời gian bên ngoài hoặc do người dùng thay đổi đồng hồ rõ ràng.
Điều này có nghĩa là nếu bạn không đủ may mắn để đo thời gian đã trôi qua khi một trong những điều chỉnh này diễn ra, bạn có thể dẫn đến việc tính toán thời gian đã trôi qua không chính xác. Điều này cũng đúng cho NSDate
/ Date
tính toán. An toàn nhất là sử dụng mach_absolute_time
phép tính dựa trên (dễ thực hiện nhất với CACurrentMediaTime
):
let start = CACurrentMediaTime()
và
let elapsed = CACurrentMediaTime() - start
Điều này sử dụng mach_absolute_time
, nhưng tránh một số phức tạp được nêu trong Hỏi và Đáp kỹ thuật QA1398 .
Tuy nhiên, hãy nhớ rằng CACurrentMediaTime
/ mach_absolute_time
sẽ được đặt lại khi thiết bị được khởi động lại. Vì vậy, điểm mấu chốt, nếu bạn cần tính toán chính xác thời gian đã trôi qua khi ứng dụng đang chạy, hãy sử dụng CACurrentMediaTime
. Nhưng nếu bạn định tiết kiệm thời gian bắt đầu này trong bộ nhớ liên tục mà bạn có thể nhớ lại khi ứng dụng được khởi động lại vào một ngày nào đó trong tương lai, thì bạn phải sử dụng Date
hoặc CFAbsoluteTimeGetCurrent
và chỉ sống với bất kỳ điểm không chính xác nào có thể mắc phải.