在类 HKManager (HKTutorial) 中完成的函数 readRunningWorkOuts 永远不会在 Swift 3 中执行

Posted

技术标签:

【中文标题】在类 HKManager (HKTutorial) 中完成的函数 readRunningWorkOuts 永远不会在 Swift 3 中执行【英文标题】:function readRunningWorkOuts with completion in class HKManager (HKTutorial) is never executed in Swift 3 【发布时间】:2017-03-06 03:50:03 【问题描述】:

我正在试用我从 Ray Wenderlich (https://www.raywenderlich.com/89733/healthkit-tutorial-with-swift-workouts) 下载的 HKTutorial,并将源代码转换为 Swift 3.0

我对 WorkoutsTableViewController 的 viewWillAppear 中的代码行为感到困惑。

转换后我的viewWillAppear版本:

  open override func viewWillAppear(_ animated: Bool) 
     super.viewWillAppear(animated)

     print("View will appear")
     healthManager?.readRunningWorkOuts( (results, error) -> Void in
        if( error != nil )
        
           print("Error reading workouts: \(error?.localizedDescription)")
           return;
        
        else
        
           print("Workouts read successfully!")
        
        print("Really")
        //Kkeep workouts and refresh tableview in main thread
        self.workouts = results as! [HKWorkout]
        DispatchQueue.main.async(execute:  () -> Void in
           self.tableView.reloadData()
        );

      )
      print("viewWillAppear ends")
  

  open override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
     print(workouts.count)
     return  workouts.count
  

以及 HKManager 类中的 func readRunningWorkouts:

  func readRunningWorkOuts(_ completion: (([AnyObject]?, NSError?) -> Void)!) 

     print("readRunningWorkOuts")
     // 1. Predicate to read only running workouts
     let predicate =  HKQuery.predicateForWorkouts(with: HKWorkoutActivityType.running)
     // 2. Order the workouts by date
     let sortDescriptor = NSSortDescriptor(key:HKSampleSortIdentifierStartDate, ascending: false)
     // 3. Create the query
     let sampleQuery = HKSampleQuery(sampleType: HKWorkoutType.workoutType(), predicate: predicate, limit: 0, sortDescriptors: [sortDescriptor])
      (sampleQuery, results, error ) -> Void in

        if let queryError = error 
           print( "There was an error while reading the samples: \(queryError.localizedDescription)")
        
        completion!(results,error as NSError?)
     
     // 4. Execute the query
     healthKitStore.execute(sampleQuery)

 

输出显示:

View will appear
viewWillAppear ends
0
0
0
0
0

func numberOfRows 中的锻炼.count 的值表示没有读取任何记录。

授权已完成,我在 Health 应用中有许多运行数据。

显然,print("View will appear") 和 print("viewWillAppear ends") 之间的语句永远不会被执行。

我错过了什么?代码是否正确?请赐教。谢谢。

项目文件可以在https://dl.dropboxusercontent.com/u/2400869/HKTutorialFinalCode.zip下载

【问题讨论】:

@TusharSharma 我做到了。该函数永远不会被调用。如果调用它,它将执行第一个打印语句。 @TusharSharma var healthManager:HealthManager? @TusharSharma 我添加了一个链接来下载我的 Xcode 项目文件。 【参考方案1】:

我通过将 WorkoutsTableViewController.swift 的第 22 行更改为:

 var  healthManager:HealthManager = HealthManager()

并更改了func viewWillAppear中的行:

 healthManager?.readRunningWorkOut(  (results, error) -> Void in

到:

healthManager.readRunningWorkOut(  (results, error) -> Void in

现在,它可以工作了。

【讨论】:

以上是关于在类 HKManager (HKTutorial) 中完成的函数 readRunningWorkOuts 永远不会在 Swift 3 中执行的主要内容,如果未能解决你的问题,请参考以下文章

为什么static成员必须在类外初始化,而不能在类的头文件中初始化

在类中声明 Alamofire.SessionManager 一次,以便在类内的各种实用程序函数中使用它

如何在类中定义装饰器?

静态成员不能在类内初始化

在类内部具有 get 和 set 访问权限但在类外部只能在 Swift 中访问的类变量? [复制]

在类函数中使用 @synchronized(self) ...