我有一个小方法可以为Objective C类赋值
locationManagerStartDate = [NSDate dateWithTimeInterval:(0 - lastRunDuration) sinceDate:lastStopDate];
NSDate *now = [NSDate date];
[cmPedometer queryPedometerDataFromDate:locationManagerStartDate toDate:now withHandler:^(CMPedometerData *pedometerData, NSError *error) {
int historySteps = pedometerData.numberOfSteps.intValue;
if (error) {
NSLog(@"error: %@", error);
}
pedometer.steps = historySteps;
run.steps = [NSNumber numberWithInt:historySteps];
run.distance = [NSNumber numberWithFloat:pedometerData.distance.floatValue + run.distance.floatValue];
double duration = [now timeIntervalSinceDate:locationManagerStartDate];
run.duration = [NSNumber numberWithDouble:duration];
}];
我在Xcode的每一行中放置了断点来检查值的变化
在行:double duration = [now timeIntervalSinceDate:locationManagerStartDate];
我检查了“持续时间”的值,它是:324634.92016398907
然后我跳过执行行:run.duration = [NSNumber numberWithDouble:duration]; }]
我检查run.duration的值,但是,该值变为:-3046
我不知道为什么会这样。
这是我在Run.h中定义“duration”属性的方法
@property (nonatomic, retain) NSNumber * duration;
这就是我在Run.m
中设置属性的方法@dynamic duration;
Run.m和Run.h会自动生成,因为它们是managedobjectcontext。
在我的代码中,不仅run.duration的值出错,而且run.steps和run.distance在赋值后变成垃圾。我通过NSLog输出或放置断点检查它们的值并使用“po”命令。通过将[now timeIntervalSinceDate:locationManagerStartDate];
移动到块区域之外来解决问题,在执行此更改后,“run.steps”和“run.distance”都能够具有正确的值,即使它们在此时间计算之前执行也是如此。 / p>
答案 0 :(得分:2)
初学者问题:您似乎不知道异步代码是什么。
您设置run.duration的代码块将在以后的某个时间执行,而不是现在。如果您启动locationManager然后立即检查run.duration,那么将变得垃圾,因为您的代码尚未执行。
这就是所有异步调用的工作方式,因此您必须学会如何处理。
答案 1 :(得分:-2)
似乎这一行是问题所在:
double duration = [now timeIntervalSinceDate:locationManagerStartDate];
run.duration = [NSNumber numberWithDouble:duration];
当我将这两行移到块的外侧时,一切都按预期开始工作。