分配的Objective C属性值变为完全不同的结果

时间:2015-03-31 01:41:27

标签: objective-c objective-c-blocks

我有一个小方法可以为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>

2 个答案:

答案 0 :(得分:2)

初学者问题:您似乎不知道异步代码是什么。

您设置run.duration的代码块将在以后的某个时间执行,而不是现在。如果您启动locationManager然后立即检查run.duration,那么变得垃圾,因为您的代码尚未执行。

这就是所有异步调用的工作方式,因此您必须学会如何处理。

答案 1 :(得分:-2)

似乎这一行是问题所在:

double duration = [now timeIntervalSinceDate:locationManagerStartDate];
run.duration = [NSNumber numberWithDouble:duration];

当我将这两行移到块的外侧时,一切都按预期开始工作。