【发布时间】:2015-05-12 09:42:56
【问题描述】:
我正在编写一个从 HealthKit 获取步数数据并在屏幕上显示统计数据的应用程序。我有一个带有委托协议功能的视图控制器:
func userValueForHistogramView(sender: HistogramView) -> CGFloat? {
return userValue
}
userValue 在哪里:
var userValue : CGFloat = 1000 {
didSet{
println("DidSet")
histogramView.setNeedsDisplay()
}
}
HistogramView 上的 drawRect 函数如下所示:
override func drawRect(rect: CGRect) {
var value = dataSource?.userValueForHistogramView(self)
println("\(value)")
}
我通过函数发起一个userValue的更新:
func startRefreshByGettingUserValue()
当函数很简单时:
func startRefreshByGettingUserValue(){
userValue = 1500;
}
我收到一条即时日志消息“DidSet”,后跟来自 redrawRect() 的 userValue 的值。
现在,当我将功能更改为:
func startRefreshByGettingUserValue(){
let calendar = NSCalendar.currentCalendar()
let today = NSDate()
let components = calendar.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: today)
let startDate = calendar.dateFromComponents(components)
let endDate = calendar.dateByAddingUnit(.CalendarUnitDay,
value: 1, toDate: startDate!, options: NSCalendarOptions(0))
let predicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate: endDate, options: .StrictStartDate)
let sampleQuery = HKStatisticsQuery(quantityType: HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount), quantitySamplePredicate: predicate, options: .CumulativeSum)
{ (sampleQuery, results, error ) -> Void in
if let quantity = results?.sumQuantity(){
self.userValue = CGFloat(quantity.doubleValueForUnit(HKUnit.countUnit()) )
}
}
HKStore.executeQuery(sampleQuery)
}
我在日志中收到即时“DidSet”消息,但实际值在 10 秒后出现(即 drawRect 滞后)。
为什么会这样?以及如何让它毫不拖延地工作?
【问题讨论】: