|
|
@@ -655,29 +655,34 @@ extension MainChartView {
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
+ // sort by date
|
|
|
+ let sortedGlucose = state.glucoseFromPersistence
|
|
|
+ .sorted { $0.date?.timeIntervalSince1970 ?? 0 < $1.date?.timeIntervalSince1970 ?? 0 }
|
|
|
+
|
|
|
var low = 0
|
|
|
- var high = state.glucoseFromPersistence.count - 1
|
|
|
+ var high = sortedGlucose.count - 1
|
|
|
+ var closestGlucose: GlucoseStored?
|
|
|
|
|
|
- while low < high {
|
|
|
+ // binary search to find next glucose
|
|
|
+ while low <= high {
|
|
|
let mid = low + (high - low) / 2
|
|
|
- let midTime = state.glucoseFromPersistence[mid].date?.timeIntervalSince1970 ?? 0
|
|
|
+ let midTime = sortedGlucose[mid].date?.timeIntervalSince1970 ?? 0
|
|
|
|
|
|
if midTime == time {
|
|
|
- return state.glucoseFromPersistence[mid]
|
|
|
+ return sortedGlucose[mid]
|
|
|
} else if midTime < time {
|
|
|
low = mid + 1
|
|
|
} else {
|
|
|
- high = mid
|
|
|
+ high = mid - 1
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- if high == state.glucoseFromPersistence.count - 1 || state.glucoseFromPersistence[high].date?
|
|
|
- .timeIntervalSince1970 ?? 0 > time
|
|
|
- {
|
|
|
- return state.glucoseFromPersistence[max(high - 1, 0)]
|
|
|
+ // update if necessary
|
|
|
+ if closestGlucose == nil || abs(midTime - time) < abs(closestGlucose!.date?.timeIntervalSince1970 ?? 0 - time) {
|
|
|
+ closestGlucose = sortedGlucose[mid]
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- return state.glucoseFromPersistence[high]
|
|
|
+ return closestGlucose
|
|
|
}
|
|
|
|
|
|
private func fullWidth(viewWidth: CGFloat) -> CGFloat {
|