问题描述
我正在尝试从 healthkit 获取 7 天的睡眠数据并在图表中显示 uit。但在这里我遇到了一些挑战
Please anyone help me
func getRecordSleepCountActivity(){
var sleepBar = [(String,Double)]()
sleepDataDictionaryArray.removeAll()
arrayToBeUploadedToServer.removeAll()
sleepBar.removeAll()
let currentDateStr = Common.instance.getDateStringFromDate()
let lastSevendays = Date.getPerticularDates(forLastNDays: 6)
let queue = OperationQueue()
queue.qualityOfService = .userInitiated
queue.maxConcurrentOperationCount = 1
let serialQueue = dispatchQueue(label: "queuename")
for i in lastSevendays{
var calendar = Calendar.current
calendar.timeZone = NSTimeZone(abbreviation: "UTC")! as TimeZone
let newStartTime = calendar.startOfDay(for: i)
print("Start Time is \(newStartTime)")
let newEndTime = calendar.date(bySettingHour: 23,minute: 59,second: 59,of: i)
print("end Time is \(newEndTime)")
queue.addOperation {
ProfileDataStore.getSleepHours(from: newStartTime,to: newEndTime) { [self] (data) in
self.totalSleepHourFromHealthKit = 0
print("sleep data count is \(data.count) for \(i)")
for item in data {
if let sample = item as? HKCategorySample {
let sleepTimeForOneDay = sample.endDate.timeIntervalSince(sample.startDate)
let sleepTimeForOneDayInHour = sleepTimeForOneDay / 60
self.sleepValue = String(describing: sleepTimeForOneDayInHour)
let StartTime = self.getNewDateAndTimeFormat(sampleDateString:sample.startDate.description,format: "MM/dd/yyyy HH:mm:ss a")
let endTime = self.getNewDateAndTimeFormat(sampleDateString:sample.endDate.description,format: "MM/dd/yyyy HH:mm:ss a")
let newSleepDict = [ "StartTime": StartTime,"EndTime":endTime,"Hours":self.sleepValue]
print("newSleepDict is \(newSleepDict)")
self.totalSleepHourFromHealthKit += Int(sleepTimeForOneDayInHour)
sleepDataDictionaryArray.append(newSleepDict)
print("sleepDataDictionaryArray is \(sleepDataDictionaryArray)")
}
}
print("sleep bars are \(sleepBar)")
self.sleepMax = 24
self.sleepMin = 2
let dateFormatterGet = DateFormatter()
dateFormatterGet.dateFormat = "MM/dd/yyyy HH:mm:ss a"
let dateFormatterPrint = DateFormatter()
dateFormatterPrint.dateFormat = "EE"
let sleepDate = (dateFormatterPrint.string(from: i))
sleepValues = (sleepDate,Double(self.totalSleepHourFromHealthKit))
// let value = (sleepDate,sleepTimeForOneDayInHour)
print("sleep values are \(sleepValues)")
// sleepBar.append(value)
sleepBar.append(sleepValues)
}
}
}
queue.addOperation {
dispatchQueue.main.async {
// print("sleep values are \(sleepValues)")
let chartConfig = BarsChartConfig(
valsAxisConfig: ChartAxisConfig(from: 0,to: Double(self.sleepMax),by: 2)
)
let frame = CGRect(x: 0,y: 0,width: self.sleepViewBar.frame.size.width,height: self.sleepViewBar.frame.size.height - 10)
let sleepChart = BarsChart(
frame: frame,chartConfig: chartConfig,xTitle: "",yTitle: "Sleep hour",bars: sleepBar,color: UIColor.red,barWidth: 10
)
sleepChart.view.reloadInputViews()
self.sleepViewBar.addSubview(sleepChart.view)
self.sleepViewChart = sleepChart
self.sleepViewChart.update()
}
}
}
I am getting response like -
sleep values are ("Sun",0.0)
sleep values are ("Mon",0.0)
sleep values are ("Wed",105.0)
sleep values are ("Thu",161.0)
sleep values are ("Tue",221.0)
sleep values are ("Fri",2901.0)
sleep values are ("Sat",0.0)
所以我的图表显示不正确
class func getSleepHours(from startDate: Date?,to endDate: Date?,completion: @escaping(_ result: [HKSample])-> Void) {
let typestoRead = Set([
HKObjectType.categoryType(forIdentifier: HKCategoryTypeIdentifier.sleepAnalysis)!
])
let typestoShare = Set([
HKObjectType.categoryType(forIdentifier: HKCategoryTypeIdentifier.sleepAnalysis)!
])
HKHealthStore().requestAuthorization(toShare: typestoShare,read: typestoRead) { (success,error) -> Void in
if success == false {
NSLog(" display not allowed")
}
if let sleepType = HKObjectType.categoryType(forIdentifier: HKCategoryTypeIdentifier.sleepAnalysis) {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd HH:mm"
let predciate = HKQuery.predicateForSamples(withStart: startDate,end: endDate,options: .strictEndDate)
let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate,ascending: false)
dispatchQueue.main.async {
let query = HKSampleQuery(sampleType: sleepType,predicate: predciate,limit: 1,sortDescriptors: [sortDescriptor]) { (query,tmpResult,error) -> Void in
if let result = tmpResult {
completion(tmpResult!)
}else{
print(error?.localizedDescription)
}
}
HKHealthStore().execute(query)
}
}
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)