首页 > 解决方案 > Swift函数执行顺序

问题描述

我正在尝试从 healthkit 加载睡眠数据。检索到一些数据后,我将其转换为 Double 类型以使用图表,并将它们反映在 setChart 函数上。但这里有一些问题。

要成功显示在图表上,我的函数应该按顺序执行。理想的顺序是:检索数据,转换数据 -> 设置图表

但订单没有保留。

我阅读了一些关于 dispatchqueue 的文章,但仍然无法解决问题。

我应该怎么做才能解决这个问题?\

override func viewDidLoad() {
    super.viewDidLoad()
    
    //선행작업
    DispatchQueue.global(qos: .userInteractive).sync {
        print("1")
        self.retrieveSleepAnalysis()

    }
    DispatchQueue.global(qos: .default).sync {
        print("2")
        self.recentSleepStartHourDouble = self.stringTimeToDouble(stringTime: self.recentSleepStartHour)
        self.wakeUp = self.wakeupTimeCalcuation(start: self.recentSleepStartHourDouble, end: self.resultToSleepAmount)
       
    }
    DispatchQueue.main.async {
        
     //   self.recentSleepStartHourDouble = self.stringTimeToDouble(stringTime: self.recentSleepStartHour)
     //   self.wakeUp = self.wakeupTimeCalcuation(start: self.recentSleepStartHourDouble, end: self.resultToSleepAmount)
        self.setChart(days: self.recentSleepDate.reversed(), sleepTimes: self.recentSleepStartHourDouble.reversed(), wakeupTimes:



public func retrieveSleepAnalysis() {

    // first, we define the object type we want
    if let sleepType = HKObjectType.categoryType(forIdentifier: HKCategoryTypeIdentifier.sleepAnalysis) {
       // print(sleepType)
        // Use a sortDescriptor to get the recent data first
        let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false)
        
        // we create our query with a block completion to execute
        
        let query = HKSampleQuery(sampleType: sleepType, predicate: nil, limit: 7, sortDescriptors: [sortDescriptor]) { (query, tmpResult, error) -> Void in
            
            if error != nil {
                // something happened
                return
            }
            if let result = tmpResult {
                              
                for item in result {
                    
                    if let sample = item as? HKCategorySample {
                        
                        let value = (sample.value == HKCategoryValueSleepAnalysis.inBed.rawValue) ? "InBed" : "Asleep"
                  
                        print("Healthkit sleep: \(sample.startDate) \(sample.endDate) - value: \(value)")
                        let sleepHour = Calendar.current.component(.hour, from: sample.startDate)
                        print("현지시각으로 잠든시간 \(sleepHour)")
                        
                        if sleepHour < 19 && sleepHour > 12{
                            print("낮잠")
                        }
                        
                        else{
                            self.resultToSleepAmount.append(CFDateGetTimeIntervalSinceDate(sample.endDate as CFDate, sample.startDate as CFDate)/3600)
                            let myDateFormatter = DateFormatter()
                            myDateFormatter.dateFormat = "MM / dd"
                            myDateFormatter.locale = Locale(identifier: "ko_KR")
                            let sleepDate = myDateFormatter.string(from: sample.startDate)
                            self.recentSleepDate.append(sleepDate)
                            
                            let myHourFormatter = DateFormatter()
                            myHourFormatter.dateFormat = "HHmm"
                            myHourFormatter.locale = Locale(identifier: "ko_KR")
                            let sleepStartHour = myHourFormatter.string(from: sample.startDate)
                            self.recentSleepStartHour.append(sleepStartHour)
                            print("잠든 시간은 몇시몇분? \(sleepStartHour)")
                            let sleepEndHour = myHourFormatter.string(from: sample.endDate)
                            self.recentSleepEndHour.append(sleepEndHour)
                            
                            
                        }
                    }
                    print("total amount of sleep time : \(self.resultToSleepAmount), 현재 크기는 : \(self.resultToSleepAmount.count)")
                }
            }
        }
        // finally, we execute our query
        healthStore.execute(query)

        
    }

标签: swiftmultithreadingfunctionasynchronoussynchronization

解决方案


推荐阅读