在类 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 一次,以便在类内的各种实用程序函数中使用它