【问题标题】:CMPedometer queryPedometerData() returning 0 steps when steps exist存在步数时,CMPedometer queryPedometerData() 返回 0 步数
【发布时间】:2018-11-28 10:48:30
【问题描述】:

CMPedometer queryPedometerData() 方法中似乎存在错误。该方法在某些结束时间返回 0 步,但时间戳高于或低于 1 秒的相同查询返回正确的步数

例如

self.getStepsBetweenDates(NSDate(timeIntervalSince1970: 1543392126) as Date, date2:  NSDate(timeIntervalSince1970: 1543393044) as Date) returns (Int) 1488

self.getStepsBetweenDates(NSDate(timeIntervalSince1970: 1543392126) as Date, date2:  NSDate(timeIntervalSince1970: 1543393045) as Date) returns (Int) 0

self.getStepsBetweenDates(NSDate(timeIntervalSince1970: 1543392126) as Date, date2:  NSDate(timeIntervalSince1970: 1543393046) as Date) returns (Int) 1488

getStepsBetweenDates 方法如下所示

func getStepsBetweenDates(_ date1: Date, date2: Date) -> Int{

    let group = DispatchGroup()
    group.enter()

    var steps = 0

    self.pedometer.queryPedometerData(from: date1, to: date2, withHandler: {
      pData, error in
      if let e = error{
          print("Error querying pedometer", e.localizedDescription)
      }else{
        if let data = pData{
          steps = Int(data.numberOfSteps)
        }
        group.leave()
      }
    })

    _ = group.wait(timeout: DispatchTime.distantFuture)
    return steps

  }

【问题讨论】:

  • getStepsBetweenDates 是如何实现的?您应该edit 您的问题以minimal reproducible example 的形式包含所有相关代码。
  • 添加了实现代码

标签: ios swift pedometer


【解决方案1】:

queryPedometerData是异步调用

通常您不想返回getStepsBetweenDates 调用中的步骤,因为它是异步的。

如果您将var steps = 0 更改为var steps = [some random int],那么由于设置了竞争条件,您很可能会得到该数字而不是 0。

更理想的做法是将您的代码实现为闭包/回调或其他形式的异步处理。

例如:

self.pedometer.queryPedometerData(from: date1, to: date2) { (data, error) in
  // Do something here with data.numberOfSteps    
}

这是 Medium 上关于异步代码的文章:

https://medium.com/ios-os-x-development/managing-async-code-in-swift-d7be44cae89f

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 2018-03-20
  • 1970-01-01
  • 2018-10-17
相关资源
最近更新 更多