2016-07-12 2 views
1

Я использую НОД в быстрой так:Выполнение функции после завершения все фонового процесса в быстрой

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 

    //all background task 

    dispatch_async(dispatch_get_main_queue()) { 
     self.second() 
    } 
} 

В этом коде второй функции вызывался до завершения все фоновой задачи, поэтому я не в состоянии возьмите некоторые данные, которые я использую во второй функции. Я хочу выполнить второй метод после выполнения всех фоновых задач. Может ли кто-нибудь сказать мне, как достичь этой задачи?

*************** В фоновом режиме я беру healthkit данные как ******

let healthKitTypesToRead = 
Set(
     arrayLiteral: HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierDateOfBirth)!, 
     HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierBiologicalSex)!, 
     HKObjectType.workoutType() 
     ) 

let newCompletion: ((Bool, NSError?) -> Void) = { 
     (success, error) -> Void in 

     if !success { 
      print("You didn't allow HealthKit to access these write data types.\nThe error was:\n \(error!.description).") 

      return 
     } 
     else 
     { 
     let stepCount = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount) 

        // Our search predicate which will fetch data from now until a day ago 
        // (Note, 1.day comes from an extension 
        // You'll want to change that to your own NSDate 

        //let date = NSDate() 
        //let predicate = HKQuery.predicateForSamplesWithStartDate(date, endDate: NSDate(), options: .None) 

        // The actual HealthKit Query which will fetch all of the steps and sub them up for us. 
        let stepCountQuery = HKSampleQuery(sampleType: stepCount!, predicate:.None, limit: 0, sortDescriptors: nil) { query, results, error in 
         var steps: Double = 0 

         if results?.count > 0 
         { 
          for result in results as! [HKQuantitySample] 
          { 
           steps += result.quantity.doubleValueForUnit(HKUnit.countUnit()) 
          } 
          testClass.HK_stepCount = String(steps) 
         } 

         //completion(steps, error) 
        } 

        self.healthKitStore.executeQuery(stepCountQuery) 
      //EDIT..... 
      let tHeartRate = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate) 
      let tHeartRateQuery = HKSampleQuery(sampleType: tHeartRate!, predicate:.None, limit: 0, sortDescriptors: nil) { query, results, error in 
       if results?.count > 0 
       { 
        var string:String = "" 
        for result in results as! [HKQuantitySample] 
        { 
         let HeartRate = result.quantity 
         string = "\(HeartRate)" 
         print(string) 
        } 
        testClass.HK_HeartRate = string 
         finalCompletion(Success: true) 

       } 

      } 
       self.healthKitStore.executeQuery(tHeartRateQuery) 
     } 

    } 


healthKitStore.requestAuthorizationToShareTypes(healthKitTypesToWrite, readTypes: healthKitTypesToRead, completion: newCompletion) 

Я не в состоянии принять значение счетчика шага, он выполняется после вызова второго (метода), plz предлагает мне, что делать?

+0

Если вы не сообщаете, что делает это " второй "метод, что такое код, вы не можете помочь вам. –

+0

Основная очередь работает одновременно. Если вы хотите выполнить 'self.second()' ** после ** вашего глобального блока очереди, вы можете добавить обработчик завершения функции. –

+0

В фоновом режиме Я беру данные набора здоровья, такие как «Счет стека» во втором методе. Мне нужно вызвать API с указанием количества шагов. Следовательно, я не могу принять это значение, потому что второй (метод) вызывается до получения значения в шаге count varaible , –

ответ

1

Вы можете создать отдельную функцию для выполнения вашей задачи на другом потоке

func someFunction(finalCompletion: (Success: Bool)->()) { 
let healthKitTypesToRead = 
Set(
     arrayLiteral: HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierDateOfBirth)!, 
     HKObjectType.characteristicTypeForIdentifier(HKCharacteristicTypeIdentifierBiologicalSex)!, 
     HKObjectType.workoutType() 
     ) 

let newCompletion: ((Bool, NSError?) -> Void) = { 
     (success, error) -> Void in 

     if !success { 
      print("You didn't allow HealthKit to access these write data types.\nThe error was:\n \(error!.description).") 

      return 
     } 
     else 
     { 
     let stepCount = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount) 

        // Our search predicate which will fetch data from now until a day ago 
        // (Note, 1.day comes from an extension 
        // You'll want to change that to your own NSDate 

        //let date = NSDate() 
        //let predicate = HKQuery.predicateForSamplesWithStartDate(date, endDate: NSDate(), options: .None) 

        // The actual HealthKit Query which will fetch all of the steps and sub them up for us. 
        let stepCountQuery = HKSampleQuery(sampleType: stepCount!, predicate:.None, limit: 0, sortDescriptors: nil) { query, results, error in 
         var steps: Double = 0 

         if results?.count > 0 
         { 

          // Edit-- 
          for result in results as! [HKQuantitySample] 
          { 
           steps += result.quantity.doubleValueForUnit(HKUnit.countUnit()) 
          // heartBeat += .... 
          } 
          testClass.HK_stepCount = String(steps) 
          finalCompletion(Success: true) 

         } 

         //completion(steps, error) 
        } 

        self.healthKitStore.executeQuery(stepCountQuery) 
     } 

    } 


healthKitStore.requestAuthorizationToShareTypes(healthKitTypesToWrite, readTypes: healthKitTypesToRead, completion: newCompletion) 
} 

Другая функция?

Я отредактирую этот ответ за некоторое время, чтобы рассказать вам о лучшей технике для решения асинхронного запроса. В общем случае для таких фоновых задач должен быть отдельный одноэлементный класс. (RESTful API класс обслуживания .. но теперь вы можете использовать метод ниже)

func getHeartBeatInfo(finalCompletionHeart: (Success: Bool)->()) { 

let tHeartRate = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate) 
     let tHeartRateQuery = HKSampleQuery(sampleType: tHeartRate!, predicate:.None, limit: 0, sortDescriptors: nil) { query, results, error in 
      if results?.count > 0 
      { 
       var string:String = "" 
       for result in results as! [HKQuantitySample] 
       { 
        let HeartRate = result.quantity 

        string = "\(HeartRate)" 
        print(string) 
       } 
       testClass.HK_HeartRate = string 
        finalCompletionHeart(Success: true) 

      } 

     } 
      self.healthKitStore.executeQuery(tHeartRateQuery) 
    } 

И тогда вы можете вызвать этот метод, как так:

override func viewDidLoad() { 

     someFunction({ (finalCompletion) in 

     if finalCompletion == true { 

      getHeartBeatInfo({ finalCompletionHeart in 

       if finalCompletionHeart == true { 

         self.second() 
       } 

      }) 
     } 
     }) 
} 
+0

self.second(), никогда не получивший вызов, я проверил. –

+0

вы должны добавить точку останова в self.second и сделать «шаг внутрь» –

+0

да, но вам нужно выполнить полную проверку, например, также добавить точки останова в результатах? .count> 0 и просмотреть итерацию цикла for. проверьте, действительно ли происходит что-то на самом деле –

Смежные вопросы